我有以下regex来验证允许的字符:
^[a-zA-Z0-9-?/:;(){}[]|`~´.,'+÷ !@#$£%^"&*_<>=àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ\]*$
我需要修改它,以便验证字符串:
- 不能以空格或"/"开头
- 不能包含"//">
- 不能以"/"结尾
对于一开始的空间,我已经将其调整为
^[^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