使用正则表达式在分号分隔列表中查找多个逗号出现

时间:2018-03-12 14:24:28

标签: regex

我试图在参考管理器中的分号分隔列表(作者姓名)中检查逗号是否多次(或根本不发生)。遗憾的是,我只能使用带有正则表达式的搜索功能,可能将多个正则表达式与AND,OR或NOT组合在一起。

我的字符串包含以分号分隔的条目。我的列表的最后一个条目最后没有分号,也可能根本没有分号(因为它只是一个条目)。正确的例子:

  • Einstein, A.; Hahn, O.; Meitner, I.
  • Einstein, A.

我想用正则表达式查找的是,如果有人确实以错误的方式输入了作者的名字(没有任何逗号或只是逗号而没有分号作为分隔符)。错误的例子:

  • Albert Einstein; Otto Hahn; Lise Meitner(分号内没有逗号)
  • Albert Einstein, Otto Hahn, Lise Meitner(列表中没有分号)
  • Einstein, A.; Otto Hahn; Meitner, L.(第二个条目中没有逗号)
  • Einstein, A.; Hahn, O., E.; Meitner, L.(第二个条目中的两个逗号)

我发现了一些类似的Problems。但是我无法得到我需要的匹配到一个正则表达式。

目前我正在组合不同的正则表达式

  1. 查找不带分号的多个逗号

    ^([^,]*,){2,}
    AND
    (?:;)+
    
  2. 在分号之前和之后查找多个分号(与OR结合)

    (([^,;]*,){2,}[^;]*;)+(([^,;]*,){2,})?
    
  3. 我仍然没有得到所有结果。因此,我想用一个正则表达式检查来测试我的搜索:

    1. 有分号吗?
    2. 分号之间或最后一个分号后是否有逗号?
    3. 分号之间或最后一个分号之后是否有多个逗号?

1 个答案:

答案 0 :(得分:0)

^               # Start of string
[^,;]*,[^,;]*   # Match an entry containing exactly one comma
(?:             # Start non-capturing group:
 ;              # Match ";"
 [^,;]*,[^,;]*  # Match an entry containing exactly one comma
)*              # Group can be matched any number of times
$               # End of string
如果满足所有要求,

仅匹配字符串。

测试live on regex101.com

请注意,目前,单个逗号符合要求(,;,;,是合法的);如果您不想要,请使用[^,;]+,[^,;]+代替[^,;]*,[^,;]*

反过来也是可能的:

^                # Start of string
(?!              # Assert that it's impossible to match...
 [^,;]*,[^,;]*   # Match an entry containing exactly one comma
 (?:             # Start non-capturing group:
  ;              # Match ";"
  [^,;]*,[^,;]*  # Match an entry containing exactly one comma
 )*              # Group can be matched any number of times
 $               # End of string
)                # End of lookahead
.*               # (optional: Match the entire string

测试live on regex101.com