【问题标题】:RegExp avoid double space and space before characters正则表达式避免字符前的双重空格和空格
【发布时间】:2022-01-06 10:39:11
【问题描述】:

我正在尝试编写一个正则表达式,以不允许字符串中的任何位置出现双空格,并在 MOGO 强制之前强制使用单个空格,开头和开头不允许空格字符串的结尾。

示例 1It is 40 GO

示例 2It is 40GO 错误

示例 3It is 40 GO 错误

这是我到目前为止所做的^[^ ][a-zA-Z0-9 ,()]*[^;'][^ ]$,它可以防止开头和结尾的空格,以及“;”特点。这个就像一个魅力。

我的问题是不允许字符串中的任何地方出现双空格,并且在 MOGO 字符之前强制使用空格。

经过几个小时的研究,我已经尝试了这些(从我之前写的 RegExp 开始):

防止出现双空格:^[^ ][a-zA-Z0-9 ,()]*((?!.* {2}).+)[^;'][^ ]$

MO之前强制一个空格:^[^ ][a-zA-Z0-9 ,()]*(?=\sMO)*[^;'][^ ]$

但最后两个实际上都不起作用。我会感谢任何帮助我解决这个问题的人

【问题讨论】:

  • 你为什么有这个? [^;'] 倒数第二个字符应该是除;' 之外的任何字符吗?这个模式^[^ ][a-zA-Z0-9 ,()]*((?!.* {2}).+)[^;'][^ ]$ 的问题是应该至少有 4 个字符长,最后一个模式在环顾后有一个量词(?=\sMO)* 你能用应该和不应该匹配的例子来更新这个问题,让它更清楚吗?
  • 我有它,因为字符串不能有任何单引号或分号。我将立即用示例编辑问题
  • 或许可以这样试试^(?!.*\S[MG]O\b)[a-zA-Z0-9,()]+(?: [a-zA-Z0-9,()]+)*$regex101.com/r/poDRsc/1
  • 这对您的所有情况都有效吗? ^(?! )(?!.* $)(?!.*?\s{2,})(?!.*\S[MG]O).*$
  • @Thefourthbird 您的解决方案有效,非常感谢!你能解释一下这部分吗? (?!.*\S[MG]O\b)据我所见,它叫lookahead,我知道我需要它,但不确定它是如何工作的

标签: javascript regex typescript


【解决方案1】:

可以省略前瞻(?!.* {2},而是以非空白字符开始匹配,以非空白字符结束匹配,并在可选重复组中使用单个空格。

如果字符串不能包含';,则使用[^;'][^ ]$ 意味着倒数第二个字符不应是这些字符中的任何一个。

但您可以省略该部分,因为字符类 [a-zA-Z0-9,()];' 不匹配

请注意,使用像 [^ ][^;'] 这样的字符类实际上需要一个字符,从而使您尝试的模式具有最小长度。

相反,您可以排除前面有非空白字符的 GO 或 MO。

^(?!.*\S[MG]O\b)[a-zA-Z0-9,()]+(?: [a-zA-Z0-9,()]+)*$

模式匹配:

  • ^ 字符串开始
  • (?!.*\S[MG]O\b) 否定前瞻,断言不是非空白字符,后跟 MOGO 到右侧。单词边界\b 防止部分单词匹配
  • [a-zA-Z0-9,()]+ 以任何列出的字符出现超过 1 次开始匹配(注意其中没有空格)
  • (?: [a-zA-Z0-9,()]+)* 可以选择使用前导空格重复相同的字符类
  • $字符串结束

Regex demo

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多