【问题标题】:regular expression not containing two or more consecutive chars不包含两个或多个连续字符的正则表达式
【发布时间】:2013-09-24 23:24:22
【问题描述】:

我需要一个正则表达式,它匹配一个以字母开头和结尾的字符串,其中包含 4-8 个字符:A-z、-、_ 和 .

字符串不得包含两个或多个连续的-、. 或_ 字符。

没有连续限制的正则表达式是^[A-z][A-z_\\.\\-]{4,8}[A-z]$这里如何添加限制或者不可能?

我知道在正则表达式中对特定单词进行否定的首选方法是否定前瞻,但我不知道如何在这里实现它。

【问题讨论】:

  • 你真的想要A-z吗?这不仅匹配所有大写和小写字母,它还匹配 ASCII 图表上 Z 和 a 之间的几个字符,特别是 '['、'\\'、']'、'^'、@ 987654336@(你想要的),以及一个很难在 StackOverflow 中输入的反引号。也许A-Za-z?
  • 请选择一种特定的语言。 Java 和 Javascript 正则表达式引擎的工作方式不同。
  • @RohitJain Java 是正确的语言
  • @ajb 是的,这就是我所需要的,但为了简单起见,我提出了 A-z

标签: java regex


【解决方案1】:

您可以预先使用否定前瞻来检查该字符类中没有任何连续字符。试试这个正则表达式:

str.matches("(?!.*([._-])\\1)[A-Za-z][a-zA-Z._-]{4,8}[a-zA-Z]");

解释:

 (?!          // Start negative look-ahead (not followed by)
     .*       // Any string
     (        // Start capture group 1
       [._-]  // Any of ., _, -
     )
     \\1       // \1 (escaped \\1) Same character captured in capture group 1 (avoid consecutive)
 )            // Look-ahead ends
 [A-Za-z]     // Alphabets
 [a-zA-Z._-]  // Any of alphabets, ., -, _
 {4,8}        // repeated 4 to 8 times
 [a-zA-Z]     // ends with alphabet

【讨论】:

  • 关于添加:解释为什么在字符类中不需要转义:link
【解决方案2】:

使用单独的正则表达式来验证字符串不包含连续字符会更容易:

if(!str.match(/--|\.\.|__/)) {
  // passed the test
}

(这是 JavaScript 语法,翻译成您选择的语言!)

【讨论】:

  • 我发现这是解决 XY 问题的更可取的方法。它比复杂化其他正则表达式更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多