我正在尝试使用正则表达式从文本中解析以下格式的方法:
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 ...我将“。+”替换为“。+?”这意味着任意数量的字符尽可能少;)
答案 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 ]+[, ].+?[\\) ][\\] ])");
正则表达式中的问题
你的正则表达式还有其他一些问题。
我认为你在写作时误解了字符类。 [\\[ ]
。此构造将匹配[
或空格。如果您想在[
之后允许可选空格(对我而言是合乎逻辑的),请执行以下操作:\\[\\s*
使用逐字字符串(带有前导@
)来定义正则表达式,以避免过度转义。
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*)");
您可以通过避免重复部分来简化正则表达式
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}
重复两次。