修改现有的Java正则表达式



我有以下regex来验证允许的字符:

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

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

  1. 不能以空格或"/"开头
  2. 不能包含"//">
  3. 不能以"/"结尾

对于一开始的空间,我已经将其调整为

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

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

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

模式开始时的[^s]将匹配除空白字符之外的任何字符,即使是您没有在字符类中指定的字符。

你可以使用

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

请参阅regex演示详细信息

  • ^(?![s/])(?!.*//)-在字符串的开头,将执行两个检查:
    • (?![s/])-不允许空白或/(位于开头)
    • (?!.*//)-除了换行字符之外,零个或多个字符之后的任何位置都不允许使用//,尽可能多
  • (?<!/)是命中字符串末尾后的检查,如果字符串中的最后一个字符是/,则匹配失败

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

似乎下面的regexp应该足够而且更简单:(?!.*//)^[^ /].*[^/]$

因此,在开始时,您可以使用负前瞻来防止//在文本中的任何位置出现。然后,除了空间和/之外的任何字符在开始时都被接受,然后任何东西都可以存在(除了//,它被负前瞻排除),并且除了/之外的任何东西在结束时都被接收。

由于在95%的情况下,空格和正斜杠
上的特殊条件不会发生,因此最好将这两个字符从
大类中取出,并在它们发生时分别处理。

大类也可以被压缩以加快速度。

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

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

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

如果你想吸收所有的类字符,它可能会变得很小。

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

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