【问题标题】:Regex to check if string starts with a letter and doesnt contain substring正则表达式检查字符串是否以字母开头并且不包含子字符串
【发布时间】:2020-06-12 03:29:01
【问题描述】:

我正在尝试提出一个检查字符串是否为正则表达式:

  • 以字母开头和
  • 不包含某些子字符串。

这是我所拥有的:

^(?!class|icon|style|color).*$

基本上我的字符串不应该有类、图标、样式或颜色的子字符串。

现在,我怎样才能让它检查它是否以字母开头?

预期行为:

  • class - 应该失败
  • class=something - 应该失败
  • :somethingelse - 应该失败
  • somethingelse - 应该通过

这是我检查起始字符的尝试:

^[a-z](?!class|icon|style|color).*$

但它只是不起作用。此正则表达式仅检查第一个条件(以字母开头),完全忽略检查“禁止”字词(类、图标等)。

谢谢!

【问题讨论】:

  • @RyanM 哦,是的!完全忘记了这一点。我现在用一个例子更新了我的问题。谢谢!
  • 字符串“这是一个标志性的教室”怎么样?您谈到子字符串和禁用词。是哪个?

标签: regex


【解决方案1】:

您非常接近,但是您的正则表达式的前两个组件被交换了。您需要在字符串的最开始检查负前瞻,而不是在第一个字符之后。交换后,您将获得:

^(?!class|icon|style|color)[a-z].*$

它通过了你的所有测试。

请注意,这不会检查它是否不包含子字符串anywhere,只是检查它不开始 与这些子字符串。为此,您可以在前瞻的开头添加.*,并将前瞻的其余部分包含在一个组中:

^(?!.*(?:class|icon|style|color))[a-z].*$

它也只在开头找到小写字母(基于您的示例和初始起点的假设)。如果您要查找任何 ASCII 字母,请将 [a-z] 替换为 [a-zA-Z]。对于任何类型的任何字母(有lots),请使用ikegami's answer。

现场演示:https://regex101.com/r/ZA3uQk/1/tests

【讨论】:

  • 太棒了!!是的,从这些子字符串开始就可以了。非常感谢!
【解决方案2】:

你所拥有的 (^(?!class|icon|style|color).*$) 甚至没有按照你所说的去做。如果字符串以class 开头 会失败,但如果它仅包含 class 则不会。

通常,为了便于阅读,您会进行两次匹配。

/^\pL/ && !/class|icon|style|color/   # \pL is short for \p{Letter}

但您可以使用前瞻来“和”多个匹配项。

/
    ^
    (?= \pL )
    (?! .* (?:class|icon|style|color) )
/sx

由于所有前瞻都在同一位置开始匹配,因此可以重新排序前瞻,如果是正前瞻,则可以将最后一个前瞻变成常规匹配。这使我们可以将上述内容简化为以下内容:

/
    ^
    (?! .* (?:class|icon|style|color) )
    \pL
/sx

好的,这在技术上是一个正则表达式匹配运算符。它相当于下面的正则表达式模式:

(?sx:
    ^
    (?! .* (?:class|icon|style|color) )
    \pL
)

您没有指定您使用的正则表达式语言。以上使用 Perl。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多