Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式解析方法签名_C#_Regex - Fatal编程技术网

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*)");