当前位置: 首页 > 面试题库 >

正则表达式单词边界在PHP中如何工作?

汤飞
2023-03-14
问题内容

我目前正在编写一个用于匹配内容中特定单词的库。

本质上,它的工作方式是将单词编译为正则表达式,然后通过所述正则表达式运行内容。

我要添加的功能是指定要匹配的给定单词是否必须以单词开头和/或结尾。例如,我有这个词cat。我指定它 必须开始一个字 ,因此catering
匹配cat是在开始,但ducat 不能匹配cat不启动的话。

我想使用单词边界来执行此操作,但是在进行一些测试时,我发现它无法正常运行。

采取以下措施,

preg_match("/(^|\b)@nimal/i", "something@nimal", $match);
preg_match("/(^|\b)@nimal/i", "something!@nimal", $match);

在上面的陈述中,我希望得到以下结果,

> false
> 1 (@nimal)

但是结果相反,

> 1 (@nimal)
> false

首先,我希望它会失败,因为小组会吃掉@,而nimal与匹配@nimal,显然不会。而是,该组匹配一个空字符串,因此@nimal被匹配,意味着@该单词被认为是单词的一部分。

在第二个中,我希望小组吃!剩下的@nimal来匹配其余的(应该)。相反,它似乎是将!@组合在一起形成一个单词,该单词通过以下匹配得到确认,

preg_match("/g\b!@\bn/i", "something!@nimal", $match);

任何想法为什么这样做的正则表达式?

我只是 喜欢 一个页面,清楚地记录了如何确定单词边界,但我终生找不到一个页面。


问题答案:

单词边界\b\w(单词字符)变为\W非单词字符时匹配。您想匹配的字符\b前面是否有@一个\W。因此,要匹配,您需要在输入文字之前@

something@nimal
        ^^

==>由于和之间的单词边界g而匹配@

something!@nimal
         ^^

==> NO匹配,因为之间!@没有字边界,这两个字符都是\W



 类似资料:
  • 问题内容: 我想在Elastisearch中使用单词边界进行正则表达式查询,但是看起来Lucene正则表达式引擎不支持。我可以使用哪些解决方法? 问题答案: 在ElasticSearch regex风格中,没有直接等效于单词边界的功能。最初是一样的东西,如果用一个字字符开始,并且尾部就像如果用一个字字符结束。 因此,我们需要确保在字符串的前后或字符串的开始/结束处有一个非单词char 。由于正则表

  • 我正在使用以下正则表达式: 我的目标是只验证数字(int和decimal),空格, ( ), 点,AND,OR。其他一切都是不允许的。它看起来像是工作的,但是我对单词边界\bAND\b和\bOR\b Eg有问题。我不能输入ANDWE或EEE或任何组合,但我能做的是AN或A。如何在字符串中只允许两个单词AND或OR?它们在字符串中是可选的。 输入示例 0.10和23-有效 12和(15或0.2)-有

  • 我试图找到一个Java正则表达式,即使在输入文本中有一个\n时,它也能匹配一个单词。请注意\n应该显示为原始字符串。我使用的是典型的单词边界https://regex101.com/r/Se5iVW/1。 例如 在这里,我期望有5个匹配项(前四个匹配项和最后一个匹配项)。

  • 问题内容: 在使用ICU-REGEXP在单词边界上执行搜索的MySQL(8.0.5+)中,它不起作用。据我了解,应该是 但是此选项不起作用。 问题答案: 首先,请注意,它可以 部分 匹配字符串,并且在搜索词之前和之后都不需要。 该字符应以定义一个反斜杠进行转义,因为本身允许MySQL的引擎逃逸字符。请参阅此MySQL 8文档 : 注意: 由于MySQL在字符串中使用C转义语法(例如,表示换行符),

  • 问题内容: 在尝试学习更多有关正则表达式的知识时,一个教程建议你可以使用b来匹配单词边界。但是,Python解释器中的以下代码片段无法按预期工作: 如果有任何匹配项,它应该是一个匹配对象,但它是。 不支持该表达式吗?还是我使用错误? 问题答案: 你为什么不尝试 输出: 还忘了提及,你应该在代码中使用原始字符串

  • 我正在尝试抓取模式中第一个连字符之后的文本 但在此模式中: 我希望它跳过‘不想要的’文本,并匹配的文本后面的下一个连字符(DesiredText)。我创建了一个具有两种模式regex101,并需要修改我的基本regex,以便如果中存在一个或多个我不想匹配的单词,那么它将匹配第二个连字符文本: https://regex101.com/r/vesqh3/1