正则表达式匹配所有用括号括起来并用管道分隔的单词

Key*_*rap 2 c# regex

我认为有时图像比文字更好。

在此输入图像描述

正如你所看到的,我的问题是它只匹配两个单词。我怎样才能匹配所有的单词?

我当前的正则表达式(PCRE):([^\|\(\)\|]+)\|([^\|\(\)\|]+)

目标:检索每个单独组中的所有单词

Wik*_*żew 5

您可以在 C# 中使用无限长度的后向查找(带有前向查找):

(?<=\([^()]*)\w+(?=[^()]*\))
Run Code Online (Sandbox Code Playgroud)

要匹配括号内不包含(,)和的任何类型的字符串|,您需要替换\w+[^()|]+

(?<=\([^()]*)[^()|]+(?=[^()]*\))
//            ^^^^^^
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示(以及正则表达式演示#2)。细节

  • (?<=\([^()]*)- 正向后查找,匹配紧接在 和 之前的位置,然后是除和(之外的零个或多个字符()
  • \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)