【发布时间】:2013-02-27 14:43:19
【问题描述】:
我想在 solr name:/.+\.m+d$/ 中运行以下正则表达式查询。我的索引中有以下名称的文档:
readme.md
2013.02.26.md
test.mmd
它们都不匹配。删除 $ 匹配 readme.md 条目。我认为问题在于我需要指定一个全局模式修饰符,但找不到执行此操作的语法。
【问题讨论】:
标签: solr
我想在 solr name:/.+\.m+d$/ 中运行以下正则表达式查询。我的索引中有以下名称的文档:
readme.md
2013.02.26.md
test.mmd
它们都不匹配。删除 $ 匹配 readme.md 条目。我认为问题在于我需要指定一个全局模式修饰符,但找不到执行此操作的语法。
【问题讨论】:
标签: solr
这些是我基于对 Solr 正则表达式匹配进行试验的观察结果:
对正则表达式中的所有特殊字符执行HTML percent encoding。 This site 有助于手动进行百分比编码。
如果要匹配整个值,请确保对字符串字段进行正则表达式匹配。文本字段上的正则表达式匹配将涉及标记化,并将根据索引期间生成的标记进行工作。
对于 solr 正则表达式,不要指定开始锚点 ^ 或结束锚点 $,因为它始终假定您匹配整个字符串。除非您在开头或结尾指定.* 或.+(或某些此类正则表达式),否则它始终与开头的^ 和结尾的$ 匹配。
我刚刚在一个字符串字段中索引了您问题中的 3 个值并发出了这个查询,它匹配所有 3 个文档:
q=id:/.%2B%5C.m%2Bd/
.%2B%5C.m%2Bd 的 PCRE 是 .+\.m+d$。
【讨论】:
curl 进行一些快速测试,否则您作为程序员的工作应该在您完成的那一刻完成已构建查询对象。它的序列化包括转义应该由您的 HTTP 查询工具(例如,jQuery.ajax)完成。如果您在生产环境中手动/显式执行此操作,则几乎可以肯定您做错了。
我在 Reg exp buddy 中尝试过这个。 IT 符合您的测试。
.+\.m+d
用于遍历字符串中所有匹配项的 php (Preg) 语法。
preg_match_all('/.+\.m+d/', $subject, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
# Matched text = $result[0][$i];
}
这是如果 ^$ 在换行符处匹配并且点匹配新行且不区分大小写
preg_match_all('/.+\.m+d/sim', $subject, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
# Matched text = $result[0][$i];
}
【讨论】:
/~/ 和 /<2-4>/ 这样的非标准扩展会做什么。