【问题标题】:Regex - Match a string which has zero or one spaces正则表达式 - 匹配包含零个或一个空格的字符串
【发布时间】:2014-07-11 14:03:04
【问题描述】:

我正在尝试匹配以@ 开头的字符串,可以包含任意数量的字母或数字,但最多只能包含一个空格(或零个空格)。到目前为止我有

@([A-Za-z0-9]+)

匹配字符但没有空格。我想我需要 \s{0,1} 但我不知道该把它放在哪里..有人可以帮忙吗?

谢谢。

【问题讨论】:

  • 字符串可以是abc[space]吗?即,它可以以空格结尾吗?
  • 或者从一个开始

标签: java regex


【解决方案1】:

假设你只关心单词中的空格,而不是前导或尾随,那么你可以使用这个:

@[A-Za-z0-9]* ?[A-Za-z0-9]*

解释:

@ 以文字 @ 开头

[A-Za-z0-9]任何字母或数字

*字母或数字长度可以是{0,infinity}

?空格字符,0或1次

[A-Za-z0-9]*空格后面的任意数量的尾随字母或空格(如果有的话)

【讨论】:

  • 效果很好,但仅适用于matches 方法。 (但是,在本案中,我认为没有理由使用其他方法)
  • 它也只匹配@
  • @AvinashRaj:是的,但问题是:“任何数量的字母或数字”
  • matches 只是在前面附加^,在后面附加$。我特意把它们去掉,以便它可以与 matchesfind 一起使用
  • @AdamYost:如果您使用find 方法,这些锚点非常重要,否则您将获得适合该模式的每个子字符串的结果。例如,使用 abc@def 时,如果您不使用锚点,find 方法将返回 @def
【解决方案2】:

您可以尝试以下正则表达式来匹配以@ 开头的单词,后跟任意数量的字母或数字以及可选的空格,

^@[a-zA-Z0-9]+ ?[a-zA-Z0-9]*$

DEMO

Java 模式是,

"^@[a-zA-Z0-9]+ ?[a-zA-Z0-9]*$"

【讨论】:

  • @Braj 未能更新演示链接。现在看来没问题了。
  • \s 还允许使用制表符和换行符。如果他们真的只允许空格,那就不好了,因为它会接受\t\n
【解决方案3】:

您可以将此正则表达式与负前瞻一起使用:

^@((?!(?:\S* ){2})[A-Za-z0-9 ]+)$

【讨论】:

    【解决方案4】:

    这是你需要的吗?

    @[A-Za-z0-9]+(?:\s?)[A-Za-z0-9]+
    

    Online demo

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多