我希望通过使用正则表达式来减少我必须编写的模式数量,该正则表达式会在字符串中显示任何或所有模式。
Regex有可能吗?
E.g. Pattern is: "the cat sat on the mat"
I would like pattern to match on following strings:
"the"
"the cat"
"the cat sat"
...
"the cat sat on the mat"
但它不应匹配以下字符串,因为尽管某些单词匹配,但它们被不匹配的单词拆分: “狗坐着”
答案 0 :(得分:7)
此:
the( cat( sat( on( the( mat)?)?)?)?)?
会回答你的问题。删除“可选组”parens“(...)?”对于非可选的部分,请为必须匹配的内容添加其他组。
the // complete match
the cat // complete match
the cat sat // complete match
the cat sat on // complete match
the cat sat on the // complete match
the cat sat on the mat // complete match
the dog sat on the mat // two partial matches ("the")
你可能想要添加一些前置条件,比如行锚的起点,以防止表达式匹配最后一行中的第二个“the”:
^the( cat( sat( on( the( mat)?)?)?)?)?
编辑:如果您添加后置条件,例如行结束锚点,则会在最后一个示例中完全阻止匹配,也就是说,最后一个示例将不匹配所有:
the( cat( sat( on( the( mat)?)?)?)?)?$
提示的积分转到VonC。谢谢!
后置条件当然可能是你期望跟随比赛的其他事情。
或者,您删除最后一个问号:
the( cat( sat( on( the( mat)?)?)?)?)
请注意:这会使单个“the”不匹配,因此第一行也不匹配。
答案 1 :(得分:2)
这可能相当复杂:
(?ms)the(?=(\s+cat)|[\r\n]+)(:?\s+cat(?=(\s+sat)|[\r\n]+))?(:?\s+sat(?=(\s+on)|[\r\n]+))?(:?\s+on(?=(\s+the)|[\r\n]+))?(:?\s+the(?=(\s+mat)|[\r\n]+))?(:?\s+mat)?[\r\n]+
含义:
the
”或行尾cat
”
cat
”(可选)只有后面跟着“sat
”匹配
猫坐在垫子上
猫
猫坐
猫坐在垫子上(也没有任何匹配)
狗坐着(没有匹配)
第二个想法,Tomalak's answer更简单(如果修复,则以'$'结尾)。
我把我作为一个维基帖。
答案 2 :(得分:1)
如果你知道匹配总是从第一个字符开始,那么在循环中直接匹配字符要快得多。我不认为Regex会这样做。
答案 3 :(得分:0)
或许以不同的方式思考问题会更容易也更合乎逻辑。
而不是将模式与字符串匹配....如何将字符串用作模式并在模式中查找。
例如
string =“猫坐在上面” pattern =“猫坐在垫子上”
string总是模式的一个子集,只是进行正则表达式匹配的情况。
如果这是有道理的; - )