0

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

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 ]+[, ].+[\\) ][\\] ])");

它正在工作,但问题是如果字符串以给定格式的方法开头,它总是在开头给我一个空数组,如果它出现在结尾,也会发生同样的情况。此外,如果字符串中出现了两个方法,它只会捕获第一个!这是为什么 ?

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


它用 ,e =D 吸引了……我用“.+?”替换了“.+” 这意味着尽可能少的任意数量的字符;)

4

1 回答 1

1

你的目标对我来说很不清楚。你想要什么结果?如果您在该方法模式上进行拆分,您将在数组中获得模式之前的部分和模式之后的部分,而不是方法本身。

回答你的问题

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

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

正则表达式中的问题

您的正则表达式中还有其他几个问题。

  1. 我认为您在编写 eg 时误解了字符类[\\[ ]。此构造将匹配 a[或空格。如果您想在[(对我来说是合乎逻辑的)之后允许可选空间,请这样做:\\[\\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}这是一个重复两次的非捕获组。

于 2012-06-11T08:05:17.827 回答