正则表达式提取模式中的分隔文本

时间:2014-10-30 08:57:36

标签: c# regex

我正在尝试解析带有引号或尖括号中某些关键字的降价标记。

"之间的字词是静态关键字,<>之间的字词是动态的。

样品:

* Say "hello" to "world"
* Say <something> to <somebody>
* I can also be a plain statement

逻辑是这样的:

  • 查找使用起始*
  • 定义的所有行
  • 检查该行是否包含关键字
  • 提取关键字(如果有)。

我有一个简单的正则表达式(\W+(\*.+))可以帮助我提取行,但我不知道如何扩展它以提取引号或尖括号之间的值。

更新1

所以,在提示@EvanKnowles的链接之后,我想出了这个似乎有效的正则表达式,但我很乐意对此进行任何改进。

[ ]*\*([\w ]*(["\<][\w ]+["\>])*)*

更新2 有些人建议在步骤中执行此操作,即在第一遍中获取所有有效行,然后在每行中查找关键字。我想将此作为我的最后一个选项,上下文是该代码的使用者需要知道关键字及其在整个字符串中的位置。因此,维护偏移量是我在分割父字符串时邀请的开销。

3 个答案:

答案 0 :(得分:2)

下面的表达式将提取所有关键字。试试吧!

    /// <summary>
    ///  A description of the regular expression:
    ///  
    ///  Beginning of line or string
    ///  [1]: A numbered capture group. [.*?\"(?<keyword>.*?)\"], one or more repetitions
    /// .*?\"(?<keyword>.*?)\"
    ///          Any character, any number of repetitions, as few as possible
    ///          Literal "
    ///          [keyword]: A named capture group. [.*?]
    ///              Any character, any number of repetitions, as few as possible
    ///          Literal "
    ///  
    ///
    /// </summary>
        public static Regex regex = new Regex(
              "^(.*?\\\"(?<keyword>.*?)\\\")+",
            RegexOptions.IgnoreCase
            | RegexOptions.Multiline
            );

        // Capture all Matches in the InputText
         MatchCollection ms = regex.Matches(InputText);

使用Expresso工具学习和创建正则表达式,它将有助于创建C#或VB.NET代码

答案 1 :(得分:1)

^(?=\*).*$

你可以分两步完成。首先抓住从*开始的行。见演示。

http://regex101.com/r/dP9rO4/2

然后,您可以通过捕获或匹配来获取关键字。

参见演示。

http://regex101.com/r/eM1xP0/2

答案 2 :(得分:0)

public static Regex regex = new Regex(
      "^\\*.*(<|\")(\\w+)(>|\")",
    RegexOptions.IgnoreCase
    | RegexOptions.Multiline
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );

使用此正则表达式,“或&lt; |&gt;之间的值将显示在组索引2处,然后您可以查找组索引1以发现找到的匹配项是静态还是动态关键字。

正如@ coder-hawk所说“使用Expresso”。它是编写和测试正则表达式的免费且非常有用的工具。