正则表达难题

时间:2008-12-02 10:03:53

标签: vb.net regex

在(Visual Basic,.NET)中:

  Dim result As Match = Regex.Match(aStr, aMatchStr)
  If result.Success Then
      Dim result0 As String = result.Groups(0).Value
      Dim result1 As String = result.Groups(1).Value
  End If

使用:aStr等于(空格是正常空格,n(之间有七个空格):

"AMEVDIEERPK + 7 Oxidation       (M)"

为什么result1成为aMatchStr等于

的空字符串
"\s*(\d*).*?Oxidation\s+\(M\)"

aMatchStr等于

变为“7”
"\s*(\d*)\s*Oxidation\s+\(M\)"

result0等于“AMEVDIEERPK + 7氧化(M)”)

(来自MSQuantMascotResultParser.vb,函数modificationParseMatch())。

8 个答案:

答案 0 :(得分:4)

\ s *零个或多个空格

(\ d *)零个或多个数字(已捕获)

。*?任何角色(非贪婪,直到下一场比赛

氧化匹配氧化一词

\ s +(M)与一个或多个空格匹配,然后是(M)

这里的问题是你匹配氧化一词之前的任何字符中的0个或更多,包括任何可能的数字,吃掉可能与之前的数字匹配的数字

\ S *(\ d *)\ S *氧化\ S +(M)

这里的区别在于您只在氧化之前指定空格。不吃数字。

将\ d *更改为\ d +以捕捉数字

答案 1 :(得分:3)

我认为这是因为匹配从第一个角色开始并从那里开始......

第一个正则表达式:

Does "AMEVDIEERPK + 7 Oxidation (M)" match "\s*(\d*).*?Oxidation\s+(M)"?  Yes.. stop matching.

对于你的第二个正则表达式:

Does "AMEVDIEERPK + 7 Oxidation (M)" match "\s*(\d*)\s*Oxidation\s+(M)"?  No...
Does "MEVDIEERPK + 7 Oxidation (M)" match "\s*(\d*)\s*Oxidation\s+(M)"?  No...
Does "EVDIEERPK + 7 Oxidation (M)" match "\s*(\d*)\s*Oxidation\s+(M)"?  No...
...
Does " 7 Oxidation (M)" match "\s*(\d*)\s*Oxidation\s+(M)"?  Yes

如果对于第一个使用\d+而不是\d*的正则表达式,您会得到更好的结果。

这不是完全正则表达式如何工作,但你明白了。

答案 2 :(得分:1)

“。*?”在这个例子中将始终匹配零个字符,因为“*?”做最短的比赛。因此,由于“O”之前的东西是空格,“\ d *”可以匹配0位数。

(抱歉引号中的空格;自动格式化程序正在吃我的语法。)

参考: Quantifiers in Regular Expressions (MSDN)

答案 3 :(得分:1)

感谢您的快速回复!

如果只有一个,则输入中的数字被省略 (肽)修饰而不是前面的7 例如:

“AMEVDIEERPK +氧化(M)”

如果使用“\ d +”则不会匹配。但也许我 应该使用两个正则表达式,每个表达式分别对应这两个 案例。这会增加程序的复杂性 有点(因为我想避免内存垃圾 为每个字符串构造正则表达式 匹配),但是可以接受。

我真正想做的是让用户具体化 匹配规则,不需要规则匹配 (肽)修饰的开始(这就是我尝试的原因 介绍非贪婪的比赛)。

现在用户的规则前缀为“\ s *(\ d *)\ s *” 因此用户必须将“氧化\ s +(M)”指定为 比赛。指定例如“dation \ s +(M)”将无效。

答案 4 :(得分:1)

要回答您的第二条消息,您(或您的用户)可以指定\w*dation\s+\(M\)以匹配Oxydation(M)或Gradation(M)或dation(M)。

答案 5 :(得分:1)

通过语法更新,我们似乎无需担心\ d +和\ d *之间的区别。即使没有数字,也总会出现+符号。匹配此+将正则表达式约束到它按预期工作的点:

"\s*    // whitespace before +
 \+     // The + sign itself
 \s*    // whitespace after +
 (\d*)  // optional digits
 .*?    // any non-digit between the last digit and Oxidation (M)
 Oxidation\s+\(M\)"

由于+必须首先匹配,并且必须精确匹配一次,因此AMEVDIEERPK前缀不能与。*?匹配。

答案 6 :(得分:1)

我现在决定使用\w*。将要求用户 指定任何空白区域的匹配,但它涵盖了 这个特定应用程序的大多数情况以及它如何 常用。

因此,对于示例,正则表达式是:

\s*(\d*)\s*\w*Oxidation\s+\(M\)

答案 7 :(得分:1)

对不起,语法还有更多...

不能依赖加号。它分开了 (肽)序列和(肽)修饰。那里 每个序列可以有多个修改。样品 有两个修改(“2”和“之间有7个空格” “L”):

“KLIDLTQFPAFVTPMGK +氧化(M); 2赖氨酸-13C615N2(K-完整)”

用户可以为第二个指定“\ S + \ s +(K-full)” 修改和“2”应该被提取。

以下是一些更多的样本行(在加号后面):

“磷酸(ST); 2二甲基(K);二甲基(N-末端)”

“磷酸(ST); 2二甲基:2H(4)(K);二甲基:2H(4)(N-末端)”

“N-乙酰基(蛋白质)”

“2二甲基:2H(4)(K);二甲基:2H(4)(N-末端)”

“N-乙酰基(蛋白质); 2赖氨酸-13C615N2(K-完整)”

“氧化(M); N-乙酰基(蛋白质)”

“氧化(M); N-乙酰基(蛋白质);赖氨酸-13C615N2(K-完整)”

“N-乙酰基(蛋白质);赖氨酸-13C615N2(K-完整)”

“氧化(M);赖氨酸-13C615N2(K-完整)”

“氧化(M)”

“2氧化(M);赖氨酸-13C615N2(K-完整)”

可在以下位置找到具有用户定义规则的示例文件 (以7-zip格式包装):

< http://www.pil.sdu.dk/1/MSQuant/CEBIquantModes,2008-11-10.7z>

相关问题