【问题标题】:Regex negation for two consecutive numbers两个连续数字的正则表达式否定
【发布时间】:2017-08-20 19:43:25
【问题描述】:

我正在尝试创建一个让我大吃一惊的正则表达式。 当我有两个连续的数字时,如何进行下面的正则表达式否定?

/^([\p{L}\p{N}\. ]+)(, ?| )([0-9-]+[a-z]?)(, ?| |$)(.*)/iu

有效示例:

Text Text 123 anything
Text Text, 123, anything
Text Text 123B anything
Text Text, 123B, anything
Text 123 anything
Text 123B anything
Text, 123, anything
Text, 123B, anything
987 123 anything
987 123B anything
987, 123, anything
987, 123B, anything

(必须)无效示例:

Text Text 456 123 anything
Text Text, 456, 123, anything
Text Text 456 123B anything
Text Text, 456, 123B, anything
Text 456 123 anything
Text 456 123B anything
Text, 456, 123, anything
Text, 456, 123B, anything
987 456 123 anything
987 456 123B anything
987, 456, 123, anything
987, 456, 123B, anything

但是正如你们所看到的,上面的所有示例都适用于我的正则表达式:https://regex101.com/r/6t5Oq5/4

要求:第一组可以有字母或数字。第二组可以有数字或数字后跟一个字母,第三组可以有任何东西。所有组可以用逗号或空格分隔。所有字母和数字都可以是任意大小。 字符串中不能有连续的数字,除非数字在第一组或最后一组(任意)。

最好的方法是什么?

【问题讨论】:

  • 不知道你的要求是什么,所以,我只能建议添加一个像here 这样的前瞻。确保在([,][ ]?)([0-9-]+[a-z]?) 之后没有任何([,][ ]?)([0-9-]+[a-z]?)
  • 你好@WiktorStribiżew,你的例子成功了,我要做更多的测试,但显然这就是我想要的!
  • 你好@WiktorStribiżew,经过几次测试,我发现这不是我想做的。我更新了我的问题以获得更准确的信息,并提供了更多示例。
  • 失败条件是什么?
  • @WiktorStribiżew 这很难解释,我什至不知道这是否可能。字符串中不能有连续的数字,除非数字在第一组或最后一组(任何)。也许我需要为此创建两个正则表达式规则。

标签: regex regex-negation regex-group


【解决方案1】:

根据您发布的内容,使用此模式 ^(\S+)(?=[^\d\r\n]+\d+[^\d\r\n]+$).* Demo

^                       # Start of string/line
(                       # Capturing Group (1)
  \S                    # <not a whitespace character>
  +                     # (one or more)(greedy)
)                       # End of Capturing Group (1)
(?=                     # Look-Ahead
  [^\d\r\n]             # Character not in [\d\r\n] Character Class
  +                     # (one or more)(greedy)
  \d                    # <digit 0-9>
  +                     # (one or more)(greedy)
  [^\d\r\n]             # Character not in [\d\r\n] Character Class
  +                     # (one or more)(greedy)
  $                     # End of string/line
)                       # End of Look-Ahead
.                       # Any character except line break
*                       # (zero or more)(greedy)

【讨论】:

  • 在以上同事的帮助下,我已经能够意识到自己想要的东西是不可能实现的。但是您的正则表达式已经更接近了,它适用于我展示的示例。所以我选择你的答案来结束关于这个主题的讨论并帮助其他有类似问题的人。谢谢!
【解决方案2】:

不是 100% 确定您的所需规则,但这里的正则表达式匹配第一个而不是第二个块:

/^([a-z0-9]+,? )([0-9]+[a-z]?,? )([a-z0-9]+)$/

在这里演示:http://regexr.com/3gjd7

【讨论】:

  • 你好@Bananaapple,很抱歉没有详细解释。第一组可能有字母或数字。第二组可以有数字或数字后跟一个字母,第三组可以有任何东西。所有组可以用逗号或空格分隔。所有字母和数字都可以是任意大小。
  • 我已经更新了我的答案以更好地满足这些标准,尽管我不清楚“任何东西”——包括空格和逗号或只是任何字母数字组合?我的新答案假设后者。
  • 任何我想说的话,包括逗号和空格。感谢您的帮助和建议!显然@WiktorStribiżew 示例成功了。我现在正在做一些测试。
  • 经过我的测试,@WiktorStribiżew 的响应不起作用。我现在更新了我的问题以更准确。但这很难解释。第一组可能有字母或数字并组成一个句子。但是,如果他在他之后和之前有一个数字,那么他是无效的。前任。 “文本文本 456 123 任何内容”
猜你喜欢
  • 2014-05-20
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多