【问题标题】:Negative lookahead on Regex Pattern正则表达式模式的负前瞻
【发布时间】:2015-02-27 19:52:30
【问题描述】:

正则表达式模式:((?:(?!.*(?:Jr|Sr|MD|I{2,3}|IV)$).?)(?:(?:\w\D[^ &%,.]+)\s?)+)(?:(Jr|Sr|MD|II{2,3}|IV).?)?

输入文本:Dela Cruz III

预期输出:第 1 组:Dela Cruz 第 2 组:III

实际输出:第 1 组:模式不匹配,因为它检测到 III 并忽略了整个字符串

目标:我希望我的正则表达式模式解析字符串并将姓氏与 Post 修复(如果有)分开。

模式似乎有什么问题?

【问题讨论】:

  • 你试过regex101.com,一个检查正则表达式的好工具:)
  • @dingo_d 不,我没有。我正在使用 regexr.com 代替。现在就试试。但是任何线索为什么 III 被认为是第 1 组的一部分?谢谢

标签: regex


【解决方案1】:

前瞻是关于紧跟在前面的字符、类或捕获组之后的内容。这个小添加使这个在这个字符串上起作用,并且应该适用于一般的单一名称样式,但如果您的目标是提取而不是验证单一名称,我们将需要更多示例。

删除 $ 可能更类似于您想要的解决方案,这取决于这些名称是否是整个字符串。

((?:(?!.*(?:Jr|Sr|MD|I{2,3}|IV)$)\.?)(?:(?:\w\D[^&%,.]+)\s?)+)

您是在进行验证还是提取?我发布的更多的是一种验证模式。

【讨论】:

  • 嗨!您的模式用于检查字符串是否具有 Jr、Sr MD 等。但是我想要实现的是仅捕获“Test 1 Test2”而不是忽略整个字符串。
  • @RomiazonSalazar 你能用一些实际的示例字符串编辑你的问题吗?是每个字符串中有这些单独的名称,还是一个字符串中有多个名称?
  • 我已经编辑了问题。我实际上是在解析名称。我已将正则表达式模式从姓氏粘贴到后缀,因为我遇到的问题主要来自那部分
  • @RomiazonSalazar 试试这个^((\b(?!(?:Jr|Sr|MD|I{2,3})\b)[a-z]+\b ?)+),或者你可能更喜欢去掉前面的胡萝卜。它将允许JrsMDS 等内容。如果您不希望这样做,请删除{2,3} 之后的\b
  • 我将模式更改为 ^(?:(?:\b(?!(?:Jr|Sr|MD|I{2,3})\b)\w\S+[^ &%,.]\b ?)+) 以便它也接受除 &% 和 . 之外的特殊字符。这样可以吗?
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多