拒绝特定的正则表达式模式

时间:2015-07-10 18:54:51

标签: regex

我对regex很新,并尝试匹配

字符串
  • 可以有任何长度
  • 可以是字母数字,也可以包含$-/
  • 不能在/-的行或末尾包含两个以上的非字母数字字符。

例如,Hello/World有效,Hello//World无效。

我已经尝试了几种不同的可能性,这一种最接近我正在期待的工作:

^--|-/|/-|\s\s|$$|$-|-$|$/|/$|//|([a-zA-Z0-9 -$/])*(?<![/-])$

这似乎足以满足每个场景,除非两个正斜杠在一起。正斜杠是否需要转义,或者是因为我的匹配表达式太宽泛而且吞下坏字符串?我尝试了其他各种表达方式,包括负面前瞻和后瞻,但它们都会遇到问题,尤其是假阴性。

干杯,

杰夫

2 个答案:

答案 0 :(得分:1)

你走在正确的道路上,负面的前瞻,你只需要包含一个捕获组参考。

^([^\$-\/]|([\$-\/])(?!\2))+?[^\/-]$

这个正则表达式对任何$, - 或/它捕获都做了负面的预测。它还有一个惰性量词,以确保它不会覆盖结束/或 - 的检查。

答案 1 :(得分:1)

以下是您正在寻找的正则表达式:

^(?![^/$-]*[/$-]{2})[\w/$-]+(?<![/-])$

Regex DemoIDEONE Java Demo

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()中不必要的)