【问题标题】:regex to match word boundary beginning with special characters正则表达式匹配以特殊字符开头的单词边界
【发布时间】:2012-10-03 16:25:50
【问题描述】:

我的正则表达式可以很好地匹配单词,除非它们包含特殊字符,例如 ~Query 是 C++ 类成员的名称。 对于单个字符的成员名称,需要使用如下所示的单词边界。 $key =~ /\b$match\b/

我尝试了许多我认为可行的表达式,例如 /[~]*\b$match\b//\b[~]*$match\b/

是否可以在可能包含特殊字符的单词上设置单词边界?

【问题讨论】:

  • 你能准确发布你想要匹配的内容吗?正则表达式是针对特定情况生成的,而不仅仅是假设你的字符串是什么……
  • /~\b$match\b/ 应该匹配 ~Query,假设包含在 $match 中的正则表达式将匹配 Query。 (我刚刚测试过," ~foo " =~ /~\bfoo\b/ 评估为 true。)
  • $match 变量可能包含 ~Query、Query 或单个字母,例如 p。开发人员可能会为他们的类方法使用任何其他奇怪的名称。正则表达式是进行搜索的子例程的一部分。一切正常,除非 $match 包含 ~Query。

标签: regex perl


【解决方案1】:
\b

简称

(?:(?<!\w)(?=\w)|(?<=\w)(?!\w))

如果要将~ 视为单词字符,请将\w 更改为[\w~]

(?:(?<![\w~])(?=[\w~])|(?<=[\w~])(?![\w~]))

示例用法:

my $word_char = qr/[\w~]/;
my $boundary  = qr/(?<!$word_char)(?=$word_char)
                  |(?<=$word_char)(?!$word_char)/x;

$key =~ /$boundary$match$boundary/

如果我们知道$match 只能匹配以$word_char 开头和结尾的东西,我们可以简化如下:

my $word_char   = qr/[\w~]/;
my $start_bound = qr/(?<!$word_char)/;
my $end_bound   = qr/(?!$word_char)/;

$key =~ /$start_bound$match$end_bound/

这很简单,我们可以内联。

$key =~ /(?<![\w~])$match(?![\w~])/

【讨论】:

  • 谢谢,这符合我的要求,虽然它很长。 $key =~ /(?:(?
  • 如果我需要包含其他特殊字符,是否会像这样添加它们 [\w~`]
  • 同样的 \b 扩展适用于 C#,替换 \w 也很有效。
  • 是否有解决 Firefox 不支持向后查看的方法?
  • @ikegami,对不起,是的 - JavaScript。我正在从文本中提取多种编程语言名称(C#、C++)。您移植到 JS 的代码非常棒,除了不支持后视的浏览器:(
【解决方案2】:

假设你不需要检查 $match 的内容(即它总是包含一个有效的标识符)你可以这样写

$key =~ /(?<![~\w])$match(?![~\w])/

它只是检查$match 中的字符串前面或后面没有字母数字、下划线或波浪线

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 2020-09-06
    • 2010-11-17
    • 2022-07-06
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多