我认为有时图像比文字更好。
正如你所看到的,我的问题是它只匹配两个单词。我怎样才能匹配所有的单词?
我当前的正则表达式(PCRE):([^\|\(\)\|]+)\|([^\|\(\)\|]+)
目标:检索每个单独组中的所有单词
您可以在 C# 中使用无限长度的后向查找(带有前向查找):
(?<=\([^()]*)\w+(?=[^()]*\))
Run Code Online (Sandbox Code Playgroud)
要匹配括号内不包含(,)和的任何类型的字符串|,您需要替换\w+为[^()|]+:
(?<=\([^()]*)[^()|]+(?=[^()]*\))
// ^^^^^^
Run Code Online (Sandbox Code Playgroud)
(?<=\([^()]*)- 正向后查找,匹配紧接在 和 之前的位置,然后是除和(之外的零个或多个字符()\w+- 一个或多个单词字符(?=[^()]*\))- 正向前瞻,匹配紧随其后的零个或多个字符(除了(and)之外的)字符)的位置。捕获这些单词的另一种方法是使用
(?:\G(?!^)\||\()(\w+)(?=[^()]*\)) // words as units consisting of letters/digits/diacritics/connector punctuation
(?:\G(?!^)\||\()([^()|]+)(?=[^()]*\)) // "words" that consist of any chars other than (, ) and |
Run Code Online (Sandbox Code Playgroud)
请参阅此正则表达式演示。您需要的单词现在位于第 1 组中。详细信息:
(?:\G(?!^)\||\()\G(?!^)- 上一个匹配 ( ) 和一个|字符 ( )之后的位置\|,或 ( |) 一个(字符 ( \()(\w+)- 第 1 组:一个或多个单词字符(?=[^()]*\))- 正向前瞻,确保当前位置右侧以外)的任何零个或多个字符后面都有一个字符。()在 C# 中提取匹配可以通过
var matches = Regex.Matches(text, @"(?<=\([^()]*)\w+(?=[^()]*\))")
.Cast<Match>()
.Select(x => x.Value);
// Or
var matches = Regex.Matches(text, @"(?:\G(?!^)\||\()(\w+)(?=[^()]*\))")
.Cast<Match>()
.Select(x => x.Groups[1].Value);
Run Code Online (Sandbox Code Playgroud)