我需要在给定字符串中允许使用字母数字字符"?","." , "/"
和"-"
。但我只需要限制连续-
。
例如:
www.google.com/flights-usa应该有效
www.google.com/flights--usa应无效
目前我正在使用^[a-zA-Z0-9\\/\\.\\?\\_\\-]+$
。
请建议我如何仅限制连续-
。
答案 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/.?_-]+
- 来自字符类$
- 字符串结束。[a-zA-Z0-9_]
标记,则 注意 \w
= Pattern.UNICODE_CHARACTER_CLASS
。因此,第一个看起来像"^[\\w/.?]+(?:-[\\w/.?]+)*$"
,第二个看起来像"^(?!.*--)[\\w/.?-]+$"
。
答案 1 :(得分:1)
一种方法是在短划线上限制带有负面后卫的多个短划线,如下所示:
^(?:[a-zA-Z0-9\/\.\?\_]|(?<!-)-)+$
|
的右侧,即(?<!-)-
,表示&#34;短划线,除非前面有另一个短划线&#34;。
答案 2 :(得分:0)
我不确定这个效率,但我相信这应该有用。
^([a-zA-Z0-9\/\.\?\_]|\-([^\-]|$))+$
对于每个字符,此正则表达式检查它是否可以匹配[a-zA-Z0-9\/\.\?\_]
,这是除了连字符之外的正则表达式中包含的所有内容。如果它不匹配,它会尝试匹配\-([^\-]|$)
,它匹配一个连字符,后面跟着另一个连字符或字符串末尾的连字符。