【问题标题】:What does this Regular expression do?这个正则表达式有什么作用?
【发布时间】:2009-08-25 09:32:25
【问题描述】:

我正在将程序从 Perl 转换为 Java。我遇到了这条线

my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/);

我不太擅长正则表达式,但据我所知,这是将字符串 $info{$host} 中的某些内容与正则表达式匹配 ^\s*(([^)]+))\s *$ 并将匹配项分配给 $title。

我的问题是我不知道正则表达式在做什么以及它将匹配什么。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 试用 Expresso (ultrapico.com),它在解析 RegEx 并展示它们的操作方式方面做得非常好。

标签: java regex perl


【解决方案1】:

正则表达式匹配一个字符串,该字符串恰好包含一对匹配的括号(实际上,一个左括号和一个匹配的右括号,但在任何数量的进一步左括号内可能出现)。

字符串可以以空白字符开头和结尾,但不能以其他字符开头。然而,在括号内,可能出现任意字符(至少一个)。

以下字符串应该匹配它:

 (abc)
 (()
   (ab)

顺便说一句,您可以简单地使用 Java 中的正则表达式(在转义反斜杠之后),使用 Pattern 类。

【讨论】:

  • 好的,所以(某些字符串)匹配但(某些)字符串)不匹配。谢谢。
  • 现在我知道它做了什么,我发现它是多余的。对于输入的所有可能性,使用 trim() 可以完成同样的操作
【解决方案2】:

它将匹配一堆前导空格,然后是左括号,然后是一些不包括右括号的文本,然后是右括号,然后是更多的空格。

匹配:

      (some stuff)  

失败:

 (some stuff

     some stuff)

   (some stuff)  asadsad

【讨论】:

  • ... 和括号内的东西(不包括括号)被重新调整为 $title 变量
【解决方案3】:

好的,一步一步来

/ - 引用正则表达式

^ - 字符串的开头

\s* - 零个或多个类似空格的字符

( - 一个实际的 ( 字符

( - 开始一个捕获组

[^)]+ 任何字符 ^ 或 ) + 表示至少一个

) - 结束捕获组

) 和实际的 ) 字符

\s* 零个或多个空格,如字符

$ - 字符串的结尾

/ - 关闭正则表达式引用

据我所知,我们正在寻找像“(^)”或“())”这样的字符串 我觉得我在这里遗漏了一些东西。

【讨论】:

    【解决方案4】:
    my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/);
    

    首先,列表上下文中的m// 返回捕获的匹配项。 my ($title) 将右侧放在列表上下文中。其次,$info{$host} 与以下模式匹配:

    /^ \s* \( ( [^\)]+) \) \s* $/x
    

    是的,使用了x 标志,所以我可以插入一些空格。 ^\s* 跳过任何前导空格。然后我们有一个转义的括号(因此没有创建捕获组。然后我们有一个包含[^\)] 的捕获组。该字符类可以更好地写为[^)],因为右括号在字符类中不是特殊的并且表示除了左括号之外的任何东西。

    如果在左括号后面有一个或多个字符而不是右括号,后括号可选地在任一侧被空格包围,则该字符序列被捕获并放入$x

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多