如何在“,”之前找到单词?

时间:2018-11-19 11:19:11

标签: c# regex

所以,我的问题是: 我使用此正则表达式查找单词,但在正则表达式上发现了问题。

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

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

Output: lvlr,lvll

但是我需要将他们分开并放在同一小组中。有可能吗?

For example

Output: lvlr
Output: lvll

1 个答案:

答案 0 :(得分:3)

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

看起来像

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

请参见regex demo。正则表达式的更有效版本是

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

enter image description here

详细信息

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

查看example C# code

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