【问题标题】:Modifying existing Java regex修改现有的 Java 正则表达式
【发布时间】:2021-09-17 08:16:41
【问题描述】:

我有以下正则表达式来验证允许的字符:

^[a-zA-Z0-9-?\/:;(){}\[\]|`~´.\,'+÷ !@#$£%^"&*_<>=àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ\\]*$

我需要修改它以便验证字符串:

  1. 不能以空格或“/”开头
  2. 可能不包含“//”
  3. 不能以“/”结尾

一开始的空间我已经适应了

^[^\s][a-zA-Z0-9-?\\/:;(){}\\[\\]|`~´.\\,'+÷ !@#$£%^\"&*_<>=àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ\\\\]*$

不知道如何处理其他两个要求 对于第二个,我尝试以各种方式将它与 ^((?!//))*$ 结合,但没有成功。

【问题讨论】:

  • @Biffen 不,它没有。还是您认为关于 SO 的所有答案都应该指向一般文档?

标签: java regex


【解决方案1】:

请注意,^((?!\/\/))*$ 匹配任何空字符串,因为前瞻是一种非消耗模式,在这里它总是返回 true

[^\s] 在您的模式开头将匹配除空白字符以外的任何字符,即使是您未在字符类中指定的字符。

你可以使用

^(?![\s/])(?!.*//)[a-zA-Z0-9?/:;(){}\[\]|`~´.,'+÷ !@#$£%^\"&*_<>=àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ\\-]*$(?<!/)

请参阅regex demo详情

  • ^(?![\s/])(?!.*//) - 在字符串的开头,执行两个检查:
    • (?![\s/]) - 不允许有空格或/(就在开头)
    • (?!.*//) - 不允许 // 在除换行符之外的零个或多个字符之后的任何位置,尽可能多
  • (?&lt;!/)是命中字符串结尾后的检查,如果字符串最后一个字符是/则匹配失败。

请注意,在 Java 正则表达式声明中,您不需要转义 /,因为不使用正则表达式分隔符表示法,并且 / 本身不是特殊的正则表达式元字符。

【讨论】:

    【解决方案2】:

    看起来下面的正则表达式应该足够了,而且更简单:(?!.*//)^[^ /].*[^/]$

    因此,在开始时,您可以使用否定前瞻来防止 // 在文本中的任何位置出现。然后在开始时接受除空格和/ 之外的任何字符,然后可以存在任何字符(除了被负前瞻排除的// 之外),最后接受除/ 之外的任何字符。

    【讨论】:

      【解决方案3】:

      因为 95% 的时间是空格和正斜杠的特殊条件
      不会发生,最好把这两个字符从你的
      大类,并在它们发生时单独处理。

      大类也可以压缩一下,加快速度。

      ^(?>[a-zA-Z0-9\\!-.:-@\[\]-`{-~£´ÄÖäö÷À-ÂÇ-ÏÑ-ÔÙ-Üß-âç-ïñ-ôù-ý]+|(?:/(?!/|$)|[ ])(?<!^.))*$
      

      https://regex101.com/r/LpCwt6/1

       ^ 
       (?>
          [a-zA-Z0-9\\!-.:-@\[\]-`{-~£´ÄÖäö÷À-ÂÇ-ÏÑ-ÔÙ-Üß-âç-ïñ-ôù-ý]+ 
        | (?:
             /
             (?! / | $ )
           | [ ] 
          )
          (?<! ^ . )
       )*
       $
      

      如果你想吸收所有的职业角色,它可以变得非常小。

      ^(?>[!-.0-~£´ÄÖäö÷À-ÂÇ-ÏÑ-ÔÙ-Üß-âç-ïñ-ôù-ý]+|(?:/(?!/|$)|[ ])(?<!^.))*$
      

      https://regex101.com/r/EYdM5C/1

      【讨论】:

        猜你喜欢
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 2022-11-19
        • 2012-03-24
        相关资源
        最近更新 更多