如何匹配字符串中间或末尾的字符,但只匹配一次

时间:2015-06-12 11:12:00

标签: java regex

我正在尝试将Java中的字符串与String.matches()匹配。

可接受的值是

  • ABC321,
  • ABC321 / OTHER888
  • 或ABC321 /

但是

  • / ABC321
  • 或ABC321 / OTHER888 /

不应该匹配。

因此/可能位于字符串的中间或末尾,但不在开头,而且只能出现一次。

这是我设法做的最接近的正则表达式:

myString.matches("^[A-Za-z0-9]+/?[A-Za-z0-9]+/?$");

但问题是/可能会出现多次。那么如何才能改进正则表达式以允许/只允许一次?

3 个答案:

答案 0 :(得分:6)

正则表达式的问题在于/允许/?至少2次。

您只需要允许/一次。

^[A-Za-z0-9]+/?[A-Za-z0-9]*$

此外,matches需要完整的字符串匹配,如果您只打算将其用于^,则无需在此正则表达式中使用$matches个锚点。< / p>

请参阅IDEONE demo

System.out.println("ABC321".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*"));
System.out.println("ABC321/OTHER888".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*"));
System.out.println("ABC321/".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*"));
System.out.println("/ABC321".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*"));
System.out.println("ABC321/OTHER888/".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*"));

输出:

true
true
true
false
false

答案 1 :(得分:0)

这个正则表达式将起作用

^[A-Za-z0-9]+\/{0,1}[A-Za-z0-9]*$

{0,1}可确保&#39; /&#39;最少0次,最多1次。

答案 2 :(得分:0)

我会使用负向前看来断言只有1个斜杠,并保持其余部分简单:

if (str.matches("(?!.*/.*/)\\w[\\w/]+"))

见(等效)live demo