【问题标题】:Regular Expression match after = to end of the line for first line that is not commented out正则表达式在 = 之后匹配到未注释掉的第一行的行尾
【发布时间】:2012-10-10 19:47:56
【问题描述】:

对于未注释掉的行,我需要将 '=' 符号之后的任何文本匹配到行尾。你能推荐一个适用于此的正则表达式吗?

Example:
  // Username = admin
     Username = [any text here should match regex]

  // Password = password
     Password= [any text here should match regex]

更新为以下示例:

One more example just for clarification:
  // FilePath = //test/test/test.log
     FilePath= //test/test/test.log

“=”之前的任何内容都是单词或单词组。其他任何事情都可以/将被忽略。

单词和“=”之间是否有空格无关紧要。我还不能实现“或”子句,但这是我正在尝试使用的当前正则表达式。如果您有更好的解决方案或可以帮助更新我的正则表达式以在游戏中工作:

Different permutations:
 (?<=Username=).+
 (?<=Username =).+

 (?<=Password=).+
 (?<=Password =).+

已解决: 感谢您提供所有示例和快速响应/帮助。以下两个正则表达式最适合我的情况,具体取决于我是希望“=”之后的所有匹配还是“=”之后基于“=”之前的特定单词的单个匹配。

^\s*\w+\s*=\s*(.+)$       // Returns all matches
^\s*Username\s*=\s*(.+)$  // Returns a single match for a specific field

【问题讨论】:

    标签: .net regex expression


    【解决方案1】:

    这应该可行:

    ^\s*\w+\s*=\s*(.+)$
    

    这是一个使用这个正则表达式的例子:

    using System;
    using System.Text.RegularExpressions;
    
    public class Example
    {
       public static void Main()
       {
          string line = "     Username = [any text here should match regex]";
    
          Regex r = new Regex(@"^\s*\w+\s*=\s*(?<text>.+)$");
          Match m = r.Match(line);
          if (m.Success)
             Console.WriteLine(r.Match(line).Result("${text}")); 
       }
    }
    

    【讨论】:

    • 我认为您应该提到您希望= 符号前面的“变量”是一个“单词”字符,并且其他所有内容都被丢弃...
    • 好的。我已经对此进行了测试,它为我提供了所有匹配项,但我想而不是返回所有匹配项,对于我的情况,我只想返回未注释的“用户名 =”或“用户名 =”的第一个匹配项。您能否建议最简单的方法是什么?
    • 完美!我想这会给我我所需要的!测试和工作至今!非常感谢您的解决方案!
    • 我只是尝试在正则表达式测试器中运行上述正则表达式(效果很好),但在我使用.Net的实际应用程序中。它似乎没有返回匹配项。我是否需要修改上述正则表达式才能使用 .Net 引擎?
    • @ThePracticalSyde 它也适用于 regexhero。我将正则表达式 ^\s*\w+\s*=\s*(.+)$ 与字符串 Username = [any text here should match regex] 一起使用。结果显示 1 场比赛和 1 组。也许我误解了你的问题。你在做不同的事情吗?
    【解决方案2】:

    这应该是诀窍:

    ^\s*(?!//)\w+\s*=\s*(.*)
    

    它是这样说的:

    ^ 行首

    \s* 任意数量的空格

    (?!//)无评论

    \w+至少一个单词字符(如果变量名允许有其他字符,应该扩展)

    \s* 任意数量的空格

    =等号

    (.*) 行的其余部分(在一个组中,因此您可以提取值)

    【讨论】:

    • 哇,你的速度真快!我会试一试,看看它是否能满足我的需要!你能否也给我一个正则表达式,它可以在 = 符号前面找到任何东西?
    • 不错的开始,但\W 不是空格,否定断言后直接跟单词字符,即如果推荐和单词之间有空格,则不会触发。跨度>
    • 这匹配注释掉的行中的文本。
    • 好的。我已经对此进行了测试并且它有效,但是我想而不是返回所有项目,对于我的情况,我只想返回未注释的“用户名=”或“用户名=”的第一个匹配项。您也可以使用该正则表达式回复此评论吗?这将涵盖我需要使用此正则表达式的所有不同情况!
    • ^\s*(?!//)Username\s*=\s*(.*)
    【解决方案3】:
    ^[^/]*=(.*)$
    

    文本将匹配到反向引用 \1。

    如果找到单个 / 则失败。

    【讨论】:

      【解决方案4】:

      这个只有在代码用换行符分隔时才有效

      ^\s*[^\\]+\s*=(.+)$
      

      使用multiline 选项

      作品here

      【讨论】:

        【解决方案5】:

        我可以通过以下方式做到这一点(我也在使用 $ 匹配换行符选项):

        Section\:(?:[^\:]*(?:=.*)?\n)*\s*Field\s*=\s*(.*?)\s*$
        
        • Section 是部分标识符
        • Field 是字段标识符
        • 不会匹配错误部分中的字段
        • 第一个捕获组将包含等号减去前导和尾随空格之后的所有内容
        • 值名称中允许使用文字冒号,但键名称中不允许使用冒号
        • 忽略注释字段
        • 忽略空白字段

        你可以用这个东西在regexpal 上测试这个:

        AnotherSection:
             SomeField = x
             AnotherField = y
        Section:
             SomeField = Z
             AnotherField = Q
             TricksyBlankField
             Field
             // ^ this field is blank
          // Field = ignored because I'm a comment
             Herp = : <-- literal colon
             Field =        (everything in the parentheses get captured)        
             ExtraStuff = something
        

        RegexPal 不显示组匹配,但它存在。

        【讨论】:

        • 感谢您的信息!生病必须查找正则表达式。
        • @ThePracticalSyde:我链接到它。它位于代码块和项目符号列表之间。
        猜你喜欢
        • 1970-01-01
        • 2013-04-20
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-26
        相关资源
        最近更新 更多