【问题标题】:Regular expression to match a string containing specific character if not surrounded by whitespace如果没有被空格包围,则正则表达式匹配包含特定字符的字符串
【发布时间】:2009-12-30 20:32:15
【问题描述】:

寻找一个匹配所有字母数字字符以及一些特殊字符(包括 + 和 -)的正则表达式字符串。我们当前的正则表达式如下所示:

^[a-zA-Z0-9_,\.\-' ]+$

但是,我们还需要包含+-,只要它们的两边都没有被空格包围。例如,A+ BC 将匹配,但 A + BC 不匹配。

尝试使用单词边界但没有成功。有什么想法吗?

【问题讨论】:

  • 这个问题有一些微妙的边缘情况,可以通过示例来解决。请解决以下问题:+ABC 会被视为匹配项吗? + ABC 呢? ABC + 呢? - ++ - 呢? - + -呢?
  • 下载 expresso,制作两个列表,一个应该通过的字符串,另一个应该失败的字符串。将它们一个接一个地放在示例文本面板中,然后处理您的正则表达式并使用验证按钮查看哪些匹配和不匹配,直到您获得完美的正则表达式。
  • @Asaph - 确实,这是一个微妙的边缘情况,其中任何一个字符都是列表中的第一个或最后一个字符。无论哪种情况,我们都会说,只要旁边有另一个字符,就可以。

标签: regex


【解决方案1】:

正如 cmets 中所说,您希望接受 +- 的块,但前提是两边都有一个字符。这似乎运作良好:

^([\w\s.,']|\b[+-]+|[+-]+\b)+$

说明:

此正则表达式只能采用+-,前提是它可以在它们之前或之后找到匹配的字符。

一个或多个:
[\w\s.,'] - 字母数字、空格、点、逗号或撇号。 或
\b[+-]+ - 字母数字、点、逗号或撇号,后跟 +- 块 或
[+-]+\b - 一个 +- 块,后跟一个字母数字、点、逗号或撇号。

测试用例:

接受: a+ bv. a+2 A+ B -C A+B +1 -2 2+++-1 +1 ++3 2++++ 1++ 2

拒绝:A + BC a|+3 >+a A - B 2+++-1 +1 ++ ++++ +

其他:

字边界在这里可能无法很好地发挥作用,因为+ 是一个字边界。它确实适用于RegExr,但您的口味可能会有所不同。这也可以:^([\w\s.,']|[\w.,'][+-]+|[+-]+[\w.,'])+$

【讨论】:

  • 这很好用,但我认为这更容易理解和维护而不会引入错误。
【解决方案2】:

怎么样:

(([^ ]|^)[-+] ?| ?[-+]([^ ]|$))

这应该匹配任何一侧有一些非空格字符的-+(如A+ BC-A -BC)。

如果你想在其中包含字母数字,你可以这样做:

((([^ ]|^)[-+] ?| ?[-+]([^ ]|$))|[a-zA-Z...]+)

然后重复一遍:

^((([^ ]|^)[-+] ?| ?[-+]([^ ]|$))|[a-zA-Z...]+)+$

这将匹配,例如 A+ B -CA+B,但不匹配 A - B

【讨论】:

  • 我会试一试。谢谢!
  • [^ ] 的使用为其他角色打开了大门。例如,您的正则表达式接受:+123a|+3
  • 天啊!好吧,那应该是[a-zA-Z0-9...] 序列。
  • 我用我的角色类代替了你的,所以还是不错的。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 2020-12-19
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多