我如何选择`|`到`|`?

问题描述 投票:2回答:4

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

I have to select | this part | and not this

我尝试使用(^|\>|\s)\|(\S+),但这样它只选择了第一个单词。

我必须选择第一个|和第二个|之间的所有角色。您对我如何实现这一点有什么建议吗?

regex
4个回答
3
投票

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

\|([^|]*)\|

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

Regex Demo


2
投票

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


1
投票

试试这个:

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

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


0
投票

如果你只有一对|,那么其他答案都很棒,但是如果你想要匹配多个实例呢?例如:

| one | two | three | four | five |

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

此时你可能想知道:为什么?答案很简单:正则表达式引擎无法匹配相同的文本两次。

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

 two | three | four | five |

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

你需要的是一种检查|存在的方法,但不包括在比赛中。这可以通过前瞻和外观来实现。现在,这将取决于您实际使用这些结构的正则表达式的风格,因此您的里程可能会有所不同。

这是一个积极的外观看起来像:

(?<=insert_expression_here)

它会尝试匹配你放在那里的任何表达式,完全匹配原始表达式中的当前位置。

积极的前瞻确实恰恰相反:

(?=insert_expression_here)

它会尝试匹配你放在那里的任何表达式,完全在原始表达式的当前位置开始匹配。

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

这是最终表达式的样子:

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

See it live!

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

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

© www.soinside.com 2019 - 2024. All rights reserved.