我试图匹配一个数字后面出现的单词 - 在下面的句子中,它是单词“米”。
塔高100英尺。
这是我尝试过的无效的模式:
\d+\s*(\b.+\b)
但是这个人做了:
\d+\s*(\w+)
第一个不正确的模式与此匹配:
塔高100英尺。
我不希望“高”这个词匹配。我期待以下行为:
\d+
match one or more occurrence of a digit
\s*
match any or no spaces
(
start new capturing group
\b
find the word/non-word boundary
.+
match 1 or more of everything except new line
\b
find the next word/non-word boundary
)
stop capturing group
问题是我不知道关于正则表达式的问题,而且我非常喜欢菜鸟。我正在练习制造自己的问题并试图解决它们 - 这是其中之一。为什么比赛在第二次休息时停止(\b)
?
这是Python风味的
Here's the regex101 test link of the above regex. 子>
答案 0 :(得分:8)
它没有停止,因为class Container
{
var list: [AnyObject] = ["hello" , "world"];
subscript ( i : Int) -> AnyObject{
get{
return list[i]
}
set{
list[i] = newValue
}
}
}
var c : Container = Container()
println(c[1])
c[1] = "lol"
println(c[1])
默认为greedy,您希望+
进行非贪婪的匹配。
简明的解释 - +?
和*
是贪婪的量词/运算符,意味着它们会尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。
您需要使用+
跟随这些运算符进行非贪婪匹配,按上述顺序进行(?
)“零或更多”或(*?
) “一个或多个” - 但最好是“尽可能少”。
字边界+?
也匹配一边是单词字符(字母,数字或下划线或Python 3中的unicode字母,数字或下划线)而另一边不是单词字符的位置。如果您不清楚边界之间的内容,我不会在\b
周围使用\b
。
答案 1 :(得分:1)
它匹配两个单词,因为.
匹配(几乎)所有字符,因此也是空格字符,并且因为+
是贪婪的,所以它将尽可能多地匹配。如果您使用\w
代替.
,那么它会起作用(因为\w
只匹配单词字符 - a-zA-Z_0-9)。