当前位置: 首页 > 知识库问答 >
问题:

获取捕获组中的每个项目

闻枫
2023-03-14

如果您有这样的字符串:

< code >【hello world】这是【最好的。家]是个好地方。

如何仅提取括号[]中的每个单词(由空格分隔)。现在我有这个工作 https://regex101.com/r/Tgokeq/2

哪个返回:

你好世界

最好的。家

但我想要:

你好

世界

最好的

。主页

PS:我知道我可以在一个foreach中做字符串拆分,但我不想要在正则表达式本身中使用它,就像这样,它得到了每个单词,除了我只想在括号[ ]中输入单词。https://regex101.com/r/eweRWj/2

共有2个答案

冯枫
2023-03-14

这种模式可能看起来不那么优雅,因为它不会单独匹配单个单词。完整的解决方案利用. net正则表达式库来获取单个单词。但是,它避免了对alpha bravo解决方案的过度回溯。其重要性在很大程度上取决于您搜索的行数和/或匹配的是大块文本还是一次只匹配单个行。

这种方法还可以准确地确定每对括号中捕获了多少个括号对以及哪些单词。一个简单的只使用模式的解决方案只会得到匹配的单词,而不需要上下文。

模式:

\[\s*((?<word>[^[\]\s]+)\s*)+]

然后是一些简短的代码,演示如何通过. Net正则表达式对象模型获取捕获的单词:

using System.Text.RegularExpressions;
...

Regex rx = new Regex(@"\[\s*((?<word>[^[\]\s]+)\s*)+]");
MatchCollection matches = rx.Matches(searchText);
foreach(Match m in matches) {
    foreach(Capture c in m.Groups["word"].Captures) {
        System.Console.WriteLine(c.Value);
    }
}

模式细分:

\[              # Opening bracket
  \s*           # Optional white space
  (             # Group for word delimited by space
    (?<word>    # Named capture group
      [^[\]\s]  # Negative character class: no brackets, no white space
      +         # one or more greedy
    )           # End named capture group
    \s*         # Match white space after word
  )             # End of word+space grouping
  +             # Match multiple occurrences of word+space
]               # Literal closing bracket (no need to escape outside character class)

上面将匹配括号之间的换行符。如果你不想要,那就用

\[\ *((?<word>[^[\]\s]+)\ *)+]
澹台聪
2023-03-14

使用此模式<代码>([^\[\] ] )(? =[^\[\]]*\]) 演示

(               # Capturing Group (1)
  [^\[\] ]      # Character not in [\[\] ] Character Class
  +             # (one or more)(greedy)
)               # End of Capturing Group (1)
(?=             # Look-Ahead
  [^\[\]]       # Character not in [\[\]] Character Class
  *             # (zero or more)(greedy)
  \]            # "]"
)               # End of Look-Ahead
 类似资料:
  • 我有一个方法返回一个

  • 问题内容: 我有一张表格,我想获取每个组的最新条目。这是桌子: 桌子 该表将按降序分组并按降序排序。对于每个,我想获取最新状态。 我的首选输出: 是否有任何汇总函数只能从每个组中获得最高排名?请参阅下面的伪代码: DocumentID, GetOnlyTheTop(Status), GetOnlyTheTop(DateCreated) FROM DocumentStatusLogs GROUP B

  • 此regex:使用多个组匹配表达式。regex的要点是它捕获两个成对的模式,其中regex的第一部分必须跟在regex的第二部分后面。 如何提取这两个组中的每一个? 这里的关键是regex匹配两次,每次包含2个组。我希望每个匹配都有一个它自己的列表,这个列表包含2个元素,每个组一个。

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

  • 模式的一部分可以用括号括起来 (...)。这称为“捕获组(capturing group)”。 这有两个影响: 它允许将匹配的一部分作为结果数组中的单独项。 如果我们将量词放在括号后,则它将括号视为一个整体。 示例 让我们看看在示例中的括号是如何工作的。 示例:gogogo 不带括号,模式 go+ 表示 g 字符,其后 o 重复一次或多次。例如 goooo 或 gooooooooo。 括号将字符组

  • 问题内容: 我有一个简单的表,像这样: 我想获得每个用户出现的前2个“字母”, 甚至更好:崩溃成列 我怎样才能在postgres中做到这一点? 问题答案: = > SQL小提琴演示