C# 使用正则表达式解析方法签名
我尝试使用正则表达式从文本中解析以下格式的方法:C# 使用正则表达式解析方法签名,c#,regex,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 ]+[, ].+[\\) ][\\] ])"); 它正在工作,但问题是,如
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。。。我将“+”替换为“+?”,这意味着尽可能少的字符数;) 我对你的目标很不清楚。你想要什么结果?如果在该方法模式上拆分,则将在数组中获得模式前的部分和模式后的部分,而不是方法本身 回答您的问题 回答您的具体问题:您的
+
是贪婪的,这意味着它将匹配任何东西直到最后一个)]
(在同一行中,
默认情况下不匹配换行符)。您可以通过在量词后面添加一个
?
来更改此行为,使其变为惰性,然后它只匹配到第一个)]
正则表达式中的问题
您的正则表达式中还有几个其他问题
[\\[]
时误解了字符类。此构造将匹配[
或空格。如果希望在[
之后允许可选空格(对我来说是合乎逻辑的),请这样做:\[\\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}
重复两次你能举一个字符串中出现的两个方法的例子吗?我认为var-tokensizedStrs=Regex。匹配(目标,模式)会起作用。@Lieven-mvAddSell[value,type1,reference(Moving,60)]+mvAddSell[value,type1,reference(Moving,60)]@MD你是什么意思!我想把它分割成一个stringsOk数组好吧。我的理解不好。不管你得到什么空字符串,因为正则表达式从输入字符串的第一个到最后一个找到匹配项。非捕获组意味着什么?该子模式的匹配项没有存储,你不能通过反向引用访问该部分。啊哈,那又如何我在回答的开头写道:不清楚你想要实现什么。如果你的字符串只包含这样一个方法,而你按照你的模式分割(假设,我不知道你的输入字符串!),所使用的模式不包括在结果数组中,但在模式前后都有一个空字符串。
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*)");