我无法想出正确的正则表达式来匹配 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