我需要防止字符/出现在java字符串的开始和结束,以及//只允许字母数字的任何地方。,()?' +/
我有这个^[^/]?([w-?:().,'+]/?)*[^/]$
的主要问题是它允许在开始处使用无效的字符#和##。
也尝试了这个^[^/]?([^W_-?:().,'+]/?)*[^/]$
来删除由w
所以这些是无效的
/
A//A
A/
#
##
但是这些都是有效的
A/A
A/A.,()+A
^(?!/)([w-?:().,'+]/?)*(?<!/)$
您可以在这里使用lookarounds
而不是0 width assertions
。参见演示。
尽量做到简单。不需要否定的字符类([^X]
-"除了X之外的任何东西")或否定的查找((?<!X)
, (?!X)
-"什么都没有,或者不是X")。你确切地知道哪些字符在字符串中是允许的,所以把它拼出来:
^[A-Za-z0-9?:().,'+-]+(?:/[A-Za-z0-9?:().,'+-]+)*$
您不需要指定斜杠(/
)不能出现在前面,只需列出可以出现的字符。当斜杠出现时,确保它后面至少有一个其他允许的字符。锚(^
和$
)确保没有其他东西进入。
你也可以试试这个
^[^/#]?([w-?:().,'+]/?)*[^/#]$
如果您明确希望#
不包含在开头或结尾,只需在您的第一个和最后一个字符类中添加[]
参见演示https://regex101.com/r/vV1wW6/43