繁体   English   中英

如何从`|`到`|`中选择?

[英]How do I select from `|` to `|`?

如何从|选择文本? | 例如:

I have to select | this part | and not this

我尝试使用(^|\\>|\\s)\\|(\\S+) ,但是通过这种方式,它仅选择第一个单词。

我必须选择第一个|之间的所有字符| 第二个| 您对我该如何实现有什么建议?

您可以使用此正则表达式,并捕获group1中的内容

\|([^|]*)\|

这里, | 是一个元字符,因此需要转义。 您可以通过匹配|启动模式| 然后捕获除|以外的任何字符 零次或多次,并在组1中捕获它,然后再匹配| 并从第一个分组模式中获取内容。

正则表达式演示

尝试\\|(.*?)\\| 问号使它成为非贪婪的表达。

尝试使用此:

\|(.*?[^\|])\|

可以选择除新行和管道(在其前面有反斜杠)之外的所有内容。

如果您只有一对|那么其他答案很好| ,但是如果您要匹配多个实例怎么办? 例如:

| one | two | three | four | five |

在上面的示例中,两个|之间有五个可能的字符串| 的。 上面的任何答案只能匹配onethreefive ,而不能匹配twofour

在这一点上,您可能想知道:为什么? 答案很简单:正则表达式引擎不能两次匹配相同的文本。

考虑当它匹配时会发生什么| one | | one | ,例如:因为| one已经匹配,而且无法再次匹配,也就是可用于进行匹配剩余的文本是:

 two | three | four | five |

请注意缺少| two 在其余的文本中, two显然不匹配,因此字符串| three | | three | 实际上是下一场比赛。 four也会发生同样的情况。

您需要的是一种检查是否存在| ,但不将其包括在比赛中。 这可以使用lookaheadslookbehinds实现。 现在,这将取决于您实际使用的提供这些结构的正则表达式的风格,因此里程可能会有所不同。

这是一个正面的样子:

(?<=insert_expression_here)

它将尝试匹配您放置在此处的任何表达式,从而完全在原始表达式的当前位置结束匹配。

积极的前瞻确实相反:

(?=insert_expression_here)

它将尝试匹配您放置在此处的任何表达式,并原始表达式中的当前位置开始精确匹配。

知道这一点,很明显我们必须检查| 在比赛的开始和结束时,在开始处使用后向( (?<=\\|) ),在结束时使用前瞻( (?=\\|) )。

最终表达式如下所示:

(?<=\|).*?(?=\|)

现场观看!

无需捕获:唯一匹配的文本就是您感兴趣的文本。另外,请注意,我们使用的是惰性表达式 :基本上,而不是尝试匹配尽可能多的字符(默认行为) ,这将整个字符串匹配,我们希望匹配尽可能的字符越好。 这样可以确保没有流浪| 您比赛中的字符。

如果您想了解有关前行和后行的更多信息,这是一个很棒的教程 了解它们不仅在构造正则表达式时为您提供了更多选择,而且还使您可以更好地了解正则表达式引擎的工作方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM