我对regex很新,并尝试匹配
字符串$
,-
或/
/
或-
的行或末尾包含两个以上的非字母数字字符。 例如,Hello/World
有效,Hello//World
无效。
我已经尝试了几种不同的可能性,这一种最接近我正在期待的工作:
^--|-/|/-|\s\s|$$|$-|-$|$/|/$|//|([a-zA-Z0-9 -$/])*(?<![/-])$
这似乎足以满足每个场景,除非两个正斜杠在一起。正斜杠是否需要转义,或者是因为我的匹配表达式太宽泛而且吞下坏字符串?我尝试了其他各种表达方式,包括负面前瞻和后瞻,但它们都会遇到问题,尤其是假阴性。
干杯,
杰夫
答案 0 :(得分:1)
你走在正确的道路上,负面的前瞻,你只需要包含一个捕获组参考。
^([^\$-\/]|([\$-\/])(?!\2))+?[^\/-]$
这个正则表达式对任何$, - 或/它捕获都做了负面的预测。它还有一个惰性量词,以确保它不会覆盖结束/或 - 的检查。
答案 1 :(得分:1)
以下是您正在寻找的正则表达式:
^(?![^/$-]*[/$-]{2})[\w/$-]+(?<![/-])$
String str1 = "Hello/World";
String str2 = "Hello//World";
String ptrn = "^(?![^/$-]*[/$-]{2})[\\w/$-]+(?<![/-])$";
System.out.println(str1.matches(ptrn)); // => true
System.out.println(str2.matches(ptrn)); // => false
说明:
^
- 字符串的开头(matches()
中不必要的)(?![^/$-]*[/$-]{2})
- 前瞻确保字符串不超过1个非字母数字字符[\w/$-]+
- 匹配字母数字字符和/
,$
或-
(?<![/-])
- 确保字符串不以禁止使用的非字母数字字符结尾的后视镜$
- 字符串结尾(matches()
中不必要的)