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