我正在处理将程序从Perl转换为Java的过程。我遇到了这个问题
my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/);
我对正则表达式不是很好但是我可以告诉它这是将字符串$ info {$ host}中的内容与正则表达式匹配^ \ s *(([^]] +))\ s * $并将匹配分配给$ title。
我的问题是我不知道正则表达式正在做什么以及它将匹配什么。任何帮助将不胜感激。
由于
答案 0 :(得分:4)
正则表达式匹配一个字符串,该字符串只包含一对匹配的括号(实际上,一个开口和一个匹配的右括号,但可能出现任意数量的其他开括号)。
字符串可以以空格字符开头和结尾,但不能以其他字符开头和结尾。然而,在parantheses内部,可能会出现任意字符(至少一个)。
以下字符串应与之匹配:
(abc)
(()
(ab)
顺便说一句,您可以使用Pattern
类在Java中使用正则表达式(在转义反斜杠之后)。
答案 1 :(得分:4)
它将匹配一堆领先的空白,然后是左边的paren,接着是一些文本,不包括右边的paren,然后是右边的paren,接着是一些更多的空格。
<强>匹配
(some stuff)
<强>失败:
(some stuff
some stuff)
(some stuff) asadsad
答案 2 :(得分:1)
一步一步
/ - 引用正则表达式
^ - 字符串的开头
\ s * - 零个或多个任何类似空格的字符
( - 实际(字符
( - 开始一个捕获组
[^]] +任何字符^或)+表示至少一个
) - 结束捕获组
)和实际的角色
\ s *零个或多个空格,如字符
$ - 字符串的结尾
/ - 关闭正则表达式引用
因此,我可以找到我们正在寻找像“(^)”或“())”这样的字符串 我在这里错过了一些东西。
答案 3 :(得分:0)
my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/);
首先,列表上下文中的m//
返回捕获的匹配项。 my ($title)
将右侧放在列表上下文中。其次,$info{$host}
与以下模式匹配:
/^ \s* \( ( [^\)]+) \) \s* $/x
是的,使用了x
标志,因此我可以插入一些空格。 ^\s*
会跳过任何前导空格。然后我们有一个转义的paranthesis(因此没有创建捕获组。然后我们有一个包含[^\)]
的捕获组。该字符类可以更好地写为[^)]
,因为右括号在字符中不是特殊的class and means 除左括号外的任何东西。
如果在左括号后面有一个或多个字符而不是右括号后跟一个右边用空格包围的右括号,则捕获该字符序列并将其放入$x
。