使用正则表达式匹配字符串中的 3 个字符的单词时缺少分隔符“^”错误

使用正则表达式匹配字符串中的 3 个字符的单词时缺少分隔符“^”错误

我无法想出正确的正则表达式来匹配 3 个字符的字符串。

我有这个字符串:

asdasa asdas asdhhgfh dfgdfdasa ttte aa1 asasda aa2

我正在尝试使用正则表达式,但无法设法制作适当的正则表达式来匹配 3 个字符长的子字符串。

我目前正在尝试调整这个 - ^.{2}$,但它没有返回预期的内容,并且我收到了缺少分隔符“^”的错误。

答案1

类似这样。你的字符串处于第二次捕获中

(^|\s)+(.{3})($|\s)+

解释

  • /(^| )(.{3})($| )/g

    • 第一捕获组Capturing group (^|\s)+

      量词:+一次至无限次之间,尽可能多次,根据需要返回 [贪婪]

      • 第一种方案:^

        • ^断言字符串开头的位置
      • 第二种选择:\s

        • \s匹配任何空白字符[\r\n\t\f ]
    • 第二捕获组(.{3})

      • .{3}匹配任意字符(换行符除外)

        量词:{3}恰好 3 次

    • 第三捕获组($| )+

      量词:+一次至无限次之间,尽可能多次,根据需要返回 [贪婪]

      • 第一种方案:$

        $断言字符串末尾的位置

      • 第二种选择:\s

        • \s匹配任何空白字符[\r\n\t\f ]
    • g修饰符:全局。所有匹配项(不返回第一个匹配项)

答案2

按照 Perl 中的一个(黑魔法)示例来提取所有 3 个字母的子字符串

perl -ne 'while(/(\w)(?=(\w\w))/g){print "$1$2\n" }'

答案3

首先,因为没有实现你的正则表达式的代码,所以我们无法确定这个问题是否与 Ubuntu 有关(是否与主题相关)。

其次,我将解释错误消息,因为对于第一次遇到该错误消息的开发人员来说,它可能会产生一些误导。它告诉您,您未能用另一个插入符号 ( ^) 结束模式。事实是,如果您只是在模式末尾添加一个插入符号,它将破坏模式的预期逻辑。您会看到,您正在编写的代码希望您的模式被包装在分隔符中 - 正斜杠是最常用的分隔符。要更正语法,只需在模式的开头和结尾添加一个斜杠即可。

第三,您的模式逻辑需要纠正。您不想使用字符串开头 ( ^) 和字符串结尾 ( $) 元字符来满足您的需求。解决方案非常简单明了,使用“单词边界”元字符 ( \b)。在线演示

/\b\w{3}\b/

无需捕获组或环视。 \w是匹配的“单词”元字符,[a-zA-Z0-9_]表示以下列表中的任何字符:小写字母、大写字母、数字和下划线。 是{3}“量词”,要求\w匹配范围内的 3 个字符。\b两侧的确保3 个匹配字符之前或之后\w{3}没有可以匹配的字符。\w

您的示例输入字符串看起来不太真实,因此很难自信地提供执行更严格验证的模式。

如果您不熟悉正则表达式,这是一个很好的阅读资源:https://www.rexegg.com/regex-php.html

相关内容