我在浏览时刚刚在线找到了以下正则表达式:
(?:^|\b)(bitcoin atm|new text|bitcoin|test a|test)(?!\w)
我很想知道在这里使用(?:^|\b)
有什么好处?
我明白基本上(?:)意味着它是一个非捕获组但我在这个特殊的括号中被^|\b
感到有点难过,在这里我理解^
基本上意味着字符串的资产开始。
\b
上的\b
示例让我对QFileDialog d(this);
d.setFileMode(QFileDialog::Directory);
d.setNameFilter("*.mp3");
if (d.exec())
qDebug () << d.selectedFiles();
的作用有了一个公平的理解,但我仍然无法根据我提供的示例将内容置于上下文中。
答案 0 :(得分:2)
(?:^|\b)
是一个非捕获组,包含2个备选方案,这两个备选方案都是零宽度断言。这意味着,它们只匹配字符串中的位置,因此不会影响您在匹配中获得的文本。
此外,当下一个子模式匹配b
,n
或t
作为第一个字符(字字符)时\b
(第一个非捕获组中的单词边界也将在字符串的开头匹配它们,使^
(字符串锚的开始)替代分支冗余在这里。
因此,您可以安全地使用
\b(bitcoin atm|new text|bitcoin|test a|test)(?!\w)
甚至
\b(bitcoin atm|new text|bitcoin|test a|test)\b
因为替代品以字符char结尾。
如果(bitcoin atm|new text|bitcoin|test a|test)
组中的备选项是用户定义的,动态的,并且可以使用非单词字符开头或结尾,那么(?:^|\b)
和(?!\w)
正则表达式模式是有意义的,但它不会是绝对的,因为(?:^|\b)\.txt(?!\w)
不会将.txt
作为整个单词匹配,所以它应该在单词char之后。我会使用(?:^|\W)
而不是(?:^|\b)
。