[英]How do I select from `|` to `|`?
如何从|
选择文本? 到|
? 例如:
I have to select | this part | and not this
我尝试使用(^|\\>|\\s)\\|(\\S+)
,但是通过这种方式,它仅选择第一个单词。
我必须选择第一个|
之间的所有字符|
第二个|
。 您对我该如何实现有什么建议?
您可以使用此正则表达式,并捕获group1中的内容
\|([^|]*)\|
这里, |
是一个元字符,因此需要转义。 您可以通过匹配|
启动模式|
然后捕获除|
以外的任何字符 零次或多次,并在组1中捕获它,然后再匹配|
并从第一个分组模式中获取内容。
尝试\\|(.*?)\\|
。 问号使它成为非贪婪的表达。
尝试使用此:
\|(.*?[^\|])\|
可以选择除新行和管道(在其前面有反斜杠)之外的所有内容。
如果您只有一对|
那么其他答案很好|
,但是如果您要匹配多个实例怎么办? 例如:
| one | two | three | four | five |
在上面的示例中,两个|
之间有五个可能的字符串|
的。 上面的任何答案只能匹配one
, three
和five
,而不能匹配two
或four
。
在这一点上,您可能想知道:为什么? 答案很简单:正则表达式引擎不能两次匹配相同的文本。
考虑当它匹配时会发生什么| one |
| one |
,例如:因为|
后one
已经匹配,而且无法再次匹配,也就是可用于进行匹配剩余的文本是:
two | three | four | five |
请注意缺少|
前two
。 在其余的文本中, two
显然不匹配,因此字符串| three |
| three |
实际上是下一场比赛。 four
也会发生同样的情况。
您需要的是一种检查是否存在|
,但不将其包括在比赛中。 这可以使用lookaheads和lookbehinds实现。 现在,这将取决于您实际使用的提供这些结构的正则表达式的风格,因此里程可能会有所不同。
这是一个正面的样子:
(?<=insert_expression_here)
它将尝试匹配您放置在此处的任何表达式,从而完全在原始表达式的当前位置结束匹配。
积极的前瞻确实相反:
(?=insert_expression_here)
它将尝试匹配您放置在此处的任何表达式,并从原始表达式中的当前位置开始精确匹配。
知道这一点,很明显我们必须检查|
在比赛的开始和结束时,在开始处使用后向( (?<=\\|)
),在结束时使用前瞻( (?=\\|)
)。
最终表达式如下所示:
(?<=\|).*?(?=\|)
无需捕获:唯一匹配的文本就是您感兴趣的文本。另外,请注意,我们使用的是惰性表达式 :基本上,而不是尝试匹配尽可能多的字符(默认行为) ,这将整个字符串匹配,我们希望匹配尽可能少的字符越好。 这样可以确保没有流浪|
您比赛中的字符。
如果您想了解有关前行和后行的更多信息,这是一个很棒的教程 。 了解它们不仅在构造正则表达式时为您提供了更多选择,而且还使您可以更好地了解正则表达式引擎的工作方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.