使用正则表达式解析方法签名

时间:2012-06-11 06:56:47

标签: c# regex

我正在尝试使用正则表达式从文本中解析以下格式的方法:

mvAddSell[value, type1, reference(Moving, 60)]

所以使用正则表达式,我正在做以下

tokensizedStrs = Regex.Split(target, "([A-Za-z ]+[\\[ ][A-Za-z0-9 ]+[ ,][A-Za-z0-9 ]+[ ,][A-Za-z0-9 ]+[\\( ][A-Za-z0-9 ]+[, ].+[\\) ][\\] ])");

它正在工作,但问题是,如果字符串以给定格式的方法启动,它总是在开头给我一个空数组,如果它最后到达则会发生相同的情况。此外,如果字符串中出现两个方法,它只捕获第一个!那是为什么?

我认为导致解析器不捕获两种方法的原因是我的模式中存在“。+”,我想要做的是我想告诉它将会有一些日期位置,所以我告诉它会有一系列任何字符,是错的吗?


它与woooorked,e = D ...我将“。+”替换为“。+?”这意味着任意数量的字符尽可能少;)

1 个答案:

答案 0 :(得分:1)

我的目标很不明确。结果你想要什么?如果拆分该方法模式,您将获得模式之前的部分以及数组中模式之后的部分,而不是方法本身。

回答您的问题

要回答您的具体问题:您的.+贪婪,这意味着它会匹配任何内容,直到最后)](在同一行中,.默认情况下与换行符不匹配)。
您可以通过在量词之后添加?以使其变得懒惰来更改此行为,然后它仅匹配到第一个)]

tokensizedStrs = Regex.Split(target, "([A-Za-z ]+[\\[ ][A-Za-z0-9 ]+[ ,][A-Za-z0-9 ]+[ ,][A-Za-z0-9 ]+[\\( ][A-Za-z0-9 ]+[, ].+?[\\) ][\\] ])");

正则表达式中的问题

你的正则表达式还有其他一些问题。

  1. 我认为你在写作时误解了字符类。 [\\[ ]。此构造将匹配[或空格。如果您想在[之后允许可选空格(对我而言是合乎逻辑的),请执行以下操作:\\[\\s*

  2. 使用逐字字符串(带有前导@)来定义正则表达式,以避免过度转义。

    tokensizedStrs = Regex.Split(target, @"([A-Za-z ]+\[\s*[A-Za-z0-9 ]+\s*,\s*[A-Za-z0-9 ]+\s*,\s*[A-Za-z0-9 ]+\(\s*[A-Za-z0-9 ]+\s*,\s*.+?\)s*\]\s*)");
    
  3. 您可以通过避免重复部分来简化正则表达式

    tokensizedStrs = Regex.Split(target, @"([A-Za-z ]+\[\s*[A-Za-z0-9 ]+(?:\s*,\s*[A-Za-z0-9 ]+){2}\(\s*[A-Za-z0-9 ]+\s*,\s*.+?\)s*\]\s*)");
    

    这是一个非捕获组(?:\s*,\s*[A-Za-z0-9 ]+){2}重复两次。