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

时间:2019-04-25 16:01:10

标签: regex

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

I have to select | this part | and not this

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

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

4 个答案:

答案 0 :(得分:3)

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

\|([^|]*)\|

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

Regex Demo

答案 1 :(得分:2)

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

答案 2 :(得分:1)

尝试使用此:

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

除了换行和竖线(在竖线之前带有反斜杠)之外,其他可以选择所有内容。

答案 3 :(得分:0)

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

| one | two | three | four | five |

在上面的示例中,两个|之间有五个可能的字符串。上面的任何答案都只会匹配onethreefive,并且不会匹配twofour。< / p>

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

考虑当它与| one |匹配时会发生什么,例如:由于|之后的one已经匹配,并且无法再次匹配,因此剩余的可用文本匹配的是:

 two | three | four | five |

请注意,在|之前没有two。在此其余文本中,two显然不是匹配项,因此字符串| three |实际上是下一个匹配项。 four也会发生同样的情况。

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

这是正向后看的样子:

(?<=insert_expression_here)

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

正向超前与之相反:

(?=insert_expression_here)

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

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

这是最终表达式的样子:

(?=\|)

See it live!

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

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