如何将正则表达式与包含通配符的字符串匹配?

时间:2014-01-10 13:17:28

标签: regex wildcard string-matching

正则表达式:

/Hello .*, what's up?/i

可包含任意数量的通配符(%)的字符串:

"% world, what's up?"    (matches)
"Hello world, %?"        (matches)
"Hello %, what's up?"    (matches)
"Hey world, what's up?"  (no match)
"Hello %, blabla."       (no match)

我自己想过一个解决方案,但我想看看你能想出什么(考虑到性能是一个高优先级)。要求是能够使用任何正则表达式;我在示例中只使用了.*,但任何有效的正则表达式都应该有效。

3 个答案:

答案 0 :(得分:1)

一点点自动机理论可能会对你有所帮助。你说

  

这是将正则表达式与正则表达式 [1]

匹配的简化版本

实际上,情况似乎并非如此。您希望找到与给定正则表达式匹配相同字符串的正则表达式,而不是匹配正则表达式的文本。

幸运的是,这个问题是可以解决的:-)要查看这样的字符串是否存在,您需要计算union of the two regular languages并测试结果是否不是空语言。这可能是一个非常重要的问题并且有效地解决它[足够]可能很难,但是已经存在标准算法。基本上,您需要将表达式转换为NFAinto DFA,然后您可以union

[1]:的确,您在问题中使用的通配符字符串构建了某种常规语言,并且可以转换为相应的正则表达式

答案 1 :(得分:0)

不确定我是否完全理解您的问题,但如果您正在寻找性能,请避免使用正则表达式。相反,您可以在%上拆分字符串。然后,看看第一场和最后一场比赛:

// Anything before % should match at start of the string
targetString.indexOf(splits[0]) === 0;

// Anything after % should match at the end of the string
targetString.indexOf(splits[1]) + splits[1].length === targetString.length;

如果您可以在字符串中多次使用%,则第一个和最后一个splits应遵循上述规则。其他任何东西只需要在字符串中,而.indexOf就是你如何检查它。

答案 2 :(得分:0)

我开始意识到使用常规语言是不可能的,因此解决此问题的唯一方法是用%替换通配符.*,然后将两个正则表达式相互匹配。但是,传统的正则表达式无法做到这一点,请查看this SO-question and it's answers for details.

或许您应该编辑基础正则表达式引擎以支持基于通配符的字符串。任何能够通过扩展默认实现来回答这个问题的人都将被接受作为这个问题的答案; - )