首页 > 解决方案 > 如何在“,”之前找到单词?

问题描述

所以,我的问题:我用这个正则表达式来查找单词,但我发现我的正则表达式有问题。

Input: local lvlr,lvll = Audiosource:GetLevel()

@"(local.(?<vars>.*?)=)"

Output: lvlr,lvll

但我需要将他们分开并在同一组中。这是可能的 ?

For example

Output: lvlr
Output: lvll

标签: c#regex

解决方案


可以使用 C# 正则表达式,因为每个捕获组都会跟踪组捕获集合中的每个捕获。但是,您的正则表达式需要一些调整才能使该功能正常工作。

它看起来像

\blocal\s+(?:(?<vars>\w+),?\s*)+=

请参阅正则表达式演示。更有效的正则表达式版本是

\blocal\s+(?<vars>\w+)(?:,\s*(?<vars>\w+))*\s*=

在此处输入图像描述

细节

  • \b- 单词边界
  • local- 一个子串
  • \s+- 1+ 空格
  • (?:(?<vars>\w+),?\s*)+- 1 次或多次出现
    • (?<vars>\w+)- 组“vars”:1 个或多个单词字符
    • ,?\s*- 一个可选的,,后跟 0+ 个空格
  • =- 一个=符号。

查看示例 C# 代码

var s = "local lvlr,lvll = Audiosource:GetLevel()";
var pattern = @"\blocal\s+(?:(?<vars>\w+),?\s*)+=";
var result = Regex.Matches(s, pattern)
          .Cast<Match>().Select(p => p.Groups["vars"].Captures)
          .ToList();
foreach (var coll in result)
    foreach (var v in coll)
        Console.WriteLine(v);

输出:

lvlr
lvll

推荐阅读