【问题标题】:Understanding `+` in regular expression理解正则表达式中的 `+`
【发布时间】:2013-09-04 02:50:48
【问题描述】:

我有一个正则表达式可以从推文中删除所有用户名。它看起来像这样:

regexFinder = "(?:\\s|\\A)[@]+([A-Za-z0-9-_]+):";

我试图了解每个组件的作用。到目前为止,我有:

(       Used to begin a “group” element
?:      Starts non-capturing group (this means one that will be removed from the final result)
\\s     Matches against shorthand characters
|       or
\\A     Matches at the start of the string and matches a position as opposed to a character
[@]     Matches against this symbol (which is used for Twitter usernames)
+       Match the previous followed by
([A-Za-z0-9- ]  Match against any capital or small characters and numbers or hyphens

不过,我对最后一点有点迷失了。有人能告诉我 +): 是什么意思吗?我假设括号结束了该组,但我没有得到冒号或加号。

如果我对正则表达式的理解有任何错误,请随时指出!

【问题讨论】:

  • 在所有情况下,如果在括号外且前面没有 \ 的情况下,+ 表示“我面前的一个或多个”
  • + 匹配紧接在它之前的一个或多个。因此,[A-Za-z0-9-_]+ 匹配至少一个字母数字字符、连字符或下划线的序列。

标签: java regex


【解决方案1】:

+ 实际上意味着它后面的“一个或多个”。

在这种情况下,[@]+ 表示“一个或多个 @ 符号”,[A-Za-z0-9-_]+ 表示“一个或多个字母、数字、破折号或下划线”。 + 是几个量词之一,learn more here

末尾的冒号只是确保匹配在匹配的末尾有一个冒号。

有时查看可视化效果会有所帮助,这是由debuggex 生成的:

【讨论】:

  • 所以问一下,这是否意味着它将遍历 @ 语句之后的所有内容,直到找到不在图表的第 1 组中的内容,或者直到找到冒号?
  • @AndrewMartin 它将查找第 1 组中的项目之一,直到它不匹配。然后它(那组字母/数字/连字符/下划线)必须后跟一个冒号,否则它不会匹配正则表达式。
  • 完美。感谢您的精彩解释
  • @AndrewMartin,没问题。另外,如果你很好奇。如果您的 group1 也包含:,那么它最后不会吃掉冒号。例如,如果您在“abadsf:sdfas:”上运行([a-z:]+):,该组将捕获“abadsf:sdfas”(不包括末尾的冒号)。就像你让它像([a-z:]+?): 那样不贪婪,它实际上会首先匹配“abadsf:”,而“abadsf”是 group1。我猜这并不是说这与您的问题真正相关:)
  • 抱歉,我以为我有。现在完成。
【解决方案2】:

+ 符号表示“前一个字符可以重复 1 次或多次”。这与* 符号形成对比,* 符号表示“前一个字符可以重复 0 次或更多次”。据我所知,冒号是字面的——它匹配字符串中的字面 :

【讨论】:

  • 所以问一下,这是否意味着它将遍历 @ 语句之后的所有内容,直到找到不在图表的第 1 组中的内容,或者直到找到冒号?
【解决方案3】:

正则表达式中的加号表示“前一个字符或一组字符出现一次或多次”。由于第二个加号在第二组括号内,因此基本上意味着第二组括号匹配任何由至少一个小写或大写字母、数字或连字符组成的字符串。

对于冒号,它在 Java 的 regex 类中没有任何意义。如果您不确定,someone else 已经知道了。

【讨论】:

    【解决方案4】:

    好吧,我们拭目以待..

    [@]+                 any character of: '@' (1 or more times)
       (                 group and capture to \1:
        [A-Za-z0-9-_]+   any character of: (a-z A-Z), (0-9), '-', '_' (1 or more times)
       )                 end of capture group \1
       :                 look for and match ':'
    

    识别以下量词:

    *      Match 0 or more times
    +      Match 1 or more times
    ?      Match 1 or 0 times
    {n}    Match exactly n times
    {n,}   Match at least n times
    {n,m}  Match at least n but not more than m times
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-25
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      相关资源
      最近更新 更多