在正文中匹配字母等级

时间:2019-06-15 22:40:46

标签: regex

我试图编写一个正则表达式来匹配嵌入在字符串中的字母等级,但是,某些字符有些困难。这些字符是单词边界处的逗号,反斜杠,正斜杠或撇号。

这些字符串可以仅由字母等级组成,也可以由字母等级和讲师留下的笔记的混合物组成。这些等级的有效范围是从A +到D-,对于失败则保留F。对于特定的字母(例如C),有效等级为:C +,C或C-。成绩永远不会出现在另一个单词中。其中一些字符串的示例如下:

string1: "A+"
string2: "B. Submitted with deferral"
string3: "F. Could not read M/C answer sheet."
string4: "C+"
string5: "Received a B- with late submission penalty."

到目前为止,我尝试过的表达式如下:

(\b[A-D]\b[+-]?)|\bF\b)

对于string1和string2,这将产生以下匹配项

  

A +

     

B 。已推迟提交”

对于string3,此表达式应匹配

  

F 。无法读取M / C答案纸。

但是匹配

  

F 。无法阅读M / C 答题纸。

任何帮助将不胜感激。


编辑:

为清楚起见,只有在以下情况下,子字符串才是字母等级:

  1. 是A +,A,A-,B +,B,B-,...,D +,D,D-形式,其中F(无符号)保留用于不及格成绩

  2. 它未嵌入单词中,例如FOA+OA+不匹配。同样,ACFB之类的子字符串也不会产生匹配项

  3. 以\ /?等字符分隔的字母不应该匹配,例如A/C, B+'C, F\D不应该匹配,而A, CA,C应该匹配两个字母。

  4. 以句点分隔的字母,例如B.A.不应导致匹配。而在句子A.之类的末尾出现的字母可能被认为是匹配项。

考虑以下示例字符串

  

字符串1:“ A-- A-C,A \ D,F / A,D'C,A,C,B + D,C-C,AB,XA,B.A。C C,   猫,F,C +,B-。”

     

string2:“ A”

     

string3:“ B +”。

     

string4:“ X”

     

string5:“ F”

在这些字符串中,唯一有效的匹配项应该是

  

字符串1:“ A--AC,A \ D,F / A,D'C, A,C ,B + D,CC,AB,XA ,BA C   C ,Cat, F C + B-。”

     

string2:“ A

     

string3:“ B + 。”

     

string5:“ F

3 个答案:

答案 0 :(得分:1)

我不确定您使用的是哪个正则表达式引擎,但是以下正则表达式适用于您介绍的所有测试用例:

See regex in use here

(?<=^|[\s,])(?:[A-D][-+]?|F)(?=[-+.]\B|[\s,]|$)
  • (?<=^|[\s,])在以下方面确保后面是以下选项之一:
    • ^在行的开头声明位置。
    • [\s,]匹配任何空白字符或逗号字符。
  • (?:[A-D][-+]?|F)匹配以下任一选项:
    • [A-D][-+]?符合以下条件:
      • [A-D]匹配ASCII表(A)中DABCD范围内的任何字符。
      • [-+]?(可选)匹配集合中的任何字符(-+
    • F从字面上进行匹配。
  • (?=[-+.]\B|[\s,]|$)前瞻性确保确保进行以下两种选择之一:
    • [-+.]\B匹配集合(-+.)中的任何字符,然后声明与单词边界不匹配的任何内容(确保后面没有字母)。
    • [\s,]匹配任何空白字符或逗号字符。
    • $在行尾声明位置。

替代项

后退固定宽度-参见使用中的here

(?:^|(?<=[\s,]))(?:[A-D][-+]?|F)(?=[-+.]\B|[\s,]|$)

无后顾之忧(改为使用捕获组)-查看使用中的here

(?:^|[\s,])([A-D][-+]?|F)(?=[-+.]\B|[\s,]|$)

答案 1 :(得分:0)

您的原始表达式很好,但是该表达式具有一个开始锚点,可能会在这里帮助我们:

(?<=^|\s)\b[A-DF]\b[+-]?

Demo 1

或与捕获组:

(?<=^|\s)(\b[A-DF]\b[+-]?)

Demo 2

或者没有环视效果,这些方法可能会起作用:

(?:^|\s)(\b[A-DF]\b[+-]?)
(^|\s)(\b[A-DF]\b[+-]?)
^(\b[A-DF]\b[+-]?)|\s(\b[A-DF]\b[+-]?)

答案 2 :(得分:0)

因为\b认为“ /”是有效的单词边界,所以匹配了“ M / C”中的“ C”。

(?<=^|\s)[A-F][+-]{0,1}(?=\W)

此正则表达式将匹配行首(^)或开头(\s)的字母等级。正后方(?<=)可以确保前导空格不被视为匹配的一部分。

字母等级之后,我们有(?=\W),它将需要一个非单词字符,并使用正向前瞻从匹配中排除边界字符。