使用Java Regex限制连续字符

时间:2016-07-22 18:56:52

标签: java regex

我需要在给定字符串中允许使用字母数字字符"?","." , "/""-"。但我只需要限制连续-

例如:

  1. www.google.com/flights-usa应该有效

  2. www.google.com/flights--usa应无效

  3. 目前我正在使用^[a-zA-Z0-9\\/\\.\\?\\_\\-]+$

    请建议我如何仅限制连续-

3 个答案:

答案 0 :(得分:3)

您可以使用量词分组:

^[a-zA-Z0-9/.?_]+(?:-[a-zA-Z0-9/.?_]+)*$

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • [a-zA-Z0-9/.?_]+ - 字符类中定义的集合中的1个或多个字符(可以替换为[\w/.?]+
  • (?:-[a-zA-Z0-9/.?_]+)* - 零个或多个序列((?:...)*):
    • - - 连字符
    • [a-zA-Z0-9/.?_]+ - 见上文
  • $ - 字符串结束。

或使用否定前瞻:

^(?!.*--)[a-zA-Z0-9/.?_-]+$
 ^^^^^^^^^

请参阅demo here

<强>详情:

  • ^ - 字符串开头
  • (?!.*--) - 一旦正则表达式引擎在除换行符之外的任何0 +字符之后找到--子字符串,将导致匹配失败的否定前瞻
  • [a-zA-Z0-9/.?_-]+ - 来自字符类
  • 中定义的集合中的1个或多个字符
  • $ - 字符串结束。
如果您不使用[a-zA-Z0-9_]标记,则

注意 \w = Pattern.UNICODE_CHARACTER_CLASS。因此,第一个看起来像"^[\\w/.?]+(?:-[\\w/.?]+)*$",第二个看起来像"^(?!.*--)[\\w/.?-]+$"

答案 1 :(得分:1)

一种方法是在短划线上限制带有负面后卫的多个短划线,如下所示:

^(?:[a-zA-Z0-9\/\.\?\_]|(?<!-)-)+$

|的右侧,即(?<!-)-,表示&#34;短划线,除非前面有另一个短划线&#34;。

Demo.

答案 2 :(得分:0)

我不确定这个效率,但我相信这应该有用。

^([a-zA-Z0-9\/\.\?\_]|\-([^\-]|$))+$

对于每个字符,此正则表达式检查它是否可以匹配[a-zA-Z0-9\/\.\?\_],这是除了连字符之外的正则表达式中包含的所有内容。如果它不匹配,它会尝试匹配\-([^\-]|$),它匹配一个连字符,后面跟着另一个连字符或字符串末尾的连字符。

Here's a demo.