簡體   English   中英

正則表達式匹配括號括起來並用豎線分隔的所有單詞

[英]Regex match all words enclosed by parentheses and separated by a pipe

我認為圖像有時比文字更好。

在此處輸入圖片說明

正如你所看到的,我的問題是它只匹配兩個單詞。 如何匹配所有單詞?

我當前的正則表達式 (PCRE) : ([^\\|\\(\\)\\|]+)\\|([^\\|\\(\\)\\|]+)

目標:為每個單詞檢索單獨分組中的所有單詞

您可以在 C# 中使用無限長的后視(帶有前瞻):

(?<=\([^()]*)\w+(?=[^()]*\))

請參閱正則表達式演示 詳情

  • (?<=\\([^()]*) - 一個正向后視匹配緊跟在(和除()之外的零個或多個字符的位置
  • \\w+ - 一個或多個單詞字符
  • (?=[^()]*\\)) - 匹配一個位置的正向前瞻,該位置緊隨其后是零個或多個字符,而不是() ,然后是)字符。

捕獲這些詞的另一種方法是使用

(?:\G(?!^)\||\()(\w+)(?=[^()]*\))

請參閱此正則表達式演示 您需要的單詞現在在第 1 組中。詳細信息

  • (?:\\G(?!^)\\||\\() - 前一個匹配之后的位置 ( \\G(?!^) ) 和| char ( \\| ),或 ( | ) a ( char ( \\( )
  • (\\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);

在 c# 中,您還可以使用捕獲組來使用組捕獲。

匹配項在命名組word

\((?<word>\w+)(?:\|(?<word>\w+))*\)
  • \\(匹配(
  • (?<word>\\w+)匹配組word 1+ 個單詞字符
  • (?:非捕獲組
    • \\| 匹配|
    • (?<word>\\w+)匹配 1+ 個單詞字符
  • )*關閉非捕獲組並可選擇重復以獲取所有出現次數
  • \\)匹配右括號

正則表達式演示

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM