gpt4 book ai didi

使用搜索语法解析搜索词的正则表达式模式

转载 作者:行者123 更新时间:2023-12-02 01:42:01 24 4
gpt4 key购买 nike

我正在编写一个搜索词解析器来对搜索标记进行分类以供以后进行后处理。到目前为止,我有这种模式:

/([+])?([\-])?(\"([^\"]+)?\"?|([^\\s]+)?|([^ *]+)?)([\\s])?/

获取示例搜索字符串,例如:

c++ +this -only this* +“是一个非常”“复杂的例子”

我想得到如下结果

G1   G2    G3                 G4                G5     G6   G7
c++ c++ [space]
+ +this this [space]
- -only only [space]
this* this * [space]
+ "is a very" is a very [space]
"complex example" complex example [space]

我得到的结果与上面的匹配项几乎相同,但 this* 项在第 5 组中显示为 this*

我知道 ... ([^\\s]+)?|([^*]+)?) ... 部分不正确,但我不知道如何更好重新制定它。我尝试了几种方法,但似乎没有通过交换子模式等找到好的解决方案。如果有人能给我一些关于如何解决这个问题并可能使搜索词匹配部分更有效的提示,我会很高兴。

这是我的测试脚本:

<?php
$s = "c++ +this -only this* +\"is a very\" \"complex example\"";
$rc = preg_match_all(
"/([+])?([\-])?(\"([^\"]+)?\"?|([^\\s]+)?|([^*]+)?)([\\s])?/",
$s,
$m);

print_r($m);
?>

非常感谢!

最佳答案

我不确定您为什么要区分 G1 和 G2。这是一个工作模式:

([-+]?)("([^"]+)"|([^\s*]+)(\*?))(\s)?

您的模式的问题在于您使用的是 ([^\\s]+)?|([^*]+)?)。由于 test* 会满足选项中的第一个条件,因此永远不会比较第二个选项。


PHP 实现将是:

$re = "~([-+]?)(\"([^\"]+)\"|([^\\s*]+)(\\*?))(\\s)?~";
$str = "c++ +this -only this* +\"is a very\" \"complex example\"";
preg_match_all($re, $str, $matches);

使用这种模式的缺点是每个单词都有一个空白的 G5(表格中的 G6)。您可以对极端情况使用前瞻,但我不会为此担心太多。

关于使用搜索语法解析搜索词的正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28043311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com