如何从|
到|
中选择文本?例如:
I have to select | this part | and not this
我尝试使用(^|\>|\s)\|(\S+)
,但是通过这种方式,它仅选择第一个单词。
我必须选择第一个|
和第二个|
之间的所有字符。您对我该如何实现有什么建议?
答案 0 :(得分:3)
您可以使用此正则表达式,并捕获group1中的内容
\|([^|]*)\|
在这里,|
是一个元字符,因此需要转义。您可以通过匹配|
来启动模式,然后捕获零次或多次捕获|
以外的任何字符,并将其捕获到group1中,然后再匹配|
并从第一分组中获取内容模式。
答案 1 :(得分:2)
尝试\|(.*?)\|
。问号使它成为非贪婪的表达。
答案 2 :(得分:1)
尝试使用此:
\|(.*?[^\|])\|
除了换行和竖线(在竖线之前带有反斜杠)之外,其他可以选择所有内容。
答案 3 :(得分:0)
如果只有一对|
,其他答案很好,但是如果要匹配多个实例怎么办?例如:
| one | two | three | four | five |
在上面的示例中,两个|
之间有五个可能的字符串。上面的任何答案都只会匹配one
,three
和five
,并且不会匹配two
或four
。< / p>
在这一点上,您可能想知道:为什么?答案很简单:正则表达式引擎不能两次匹配相同的文本。
考虑当它与| one |
匹配时会发生什么,例如:由于|
之后的one
已经匹配,并且无法再次匹配,因此剩余的可用文本匹配的是:
two | three | four | five |
请注意,在|
之前没有two
。在此其余文本中,two
显然不是匹配项,因此字符串| three |
实际上是下一个匹配项。 four
也会发生同样的情况。
您需要的是一种检查|
是否存在的方法,但不包括在比赛中。可以使用先行和后退来实现。现在,这取决于您实际使用的提供这些结构的正则表达式的风格,因此里程可能会有所不同。
这是正向后看的样子:
(?<=insert_expression_here)
它将尝试匹配您放置在此处的任何表达式,并完全在原始表达式的当前位置结束匹配。
正向超前与之相反:
(?=insert_expression_here)
它将尝试匹配您放置在此处的任何表达式,开始完全匹配原始表达式中的当前位置。
知道了这一点,很明显,我们必须在比赛开始和结束时检查|
,在开始时使用后向((?<=\|)
)和前瞻({ {1}})。
这是最终表达式的样子:
(?=\|)
无需捕获:唯一匹配的文本就是您感兴趣的文本。另外,请注意,我们使用的是惰性表达式:基本上是在尝试匹配尽可能匹配整个字符串的字符(默认行为),我们希望尽可能地匹配几个个字符。这样可以确保比赛中没有流浪(?<=\|).*?(?=\|)
字符。
如果您想了解有关前行和后行的更多信息,这是一个很棒的tutorial。了解它们不仅可以在构造正则表达式时为您提供更多选择,还可以使您更好地了解正则表达式引擎的工作原理。