我试图构建一个在最后一次出现数字之前和之后拆分的正则表达式。我希望得到:
"index100.html" # => ["index", "100", ".html"]
"page.php?id=100" # => ["page.php?id=", "100", ""]
"page.php?f=5&page=295" # => ['page.php?f=5&page=', 295, '']
这是我提出的正则表达式:
regex = /([^0-9]+|^)(\d+?)([^0-9]+|$)/
它适用于前两个示例,但不适用于最后一个示例。我得到了结果:
["page.php?f=", 5, "&page="]
如何修改正则表达式以使其适用于第三种情况?
答案 0 :(得分:3)
你可以利用.*
贪婪的匹配,但用负面的后瞻(?<!\d)
来限制它,以确保你匹配整个最后一组数字:
/(.*)(?<!\d)(\d+)(.*)/
^^^^^^^^^^^
请参阅regex demo。或者,您可以在开头和结尾添加\A
和\z
个锚点。
<强>详情:
(.*)
- 除了换行符之外的0个或更多字符,尽可能多,与最后一个匹配(?<!\d)(\d+)
- 1+位前面没有数字(.*)
- 其余部分。要匹配换行符,请在最后一个正则表达式分隔符后添加m
修饰符。
答案 1 :(得分:3)
另一种没有外观的方式。
((?:\d*\D)*)(\d+)(.*)
另一个没有外观的人
(这与使用lookbehind
一样快
但是如果你没有它,比如JS,那就更好了)
(.*(?:\D|^))(\d+)(.*)
答案 2 :(得分:1)
"index100.html"
.partition(/\d+(?=\D*\z)/) # => ["index", "100", ".html"]
"page.php?id=100"
.partition(/\d+(?=\D*\z)/) # => ["page.php?id=", "100", ""]
"page.php?f=5&page=295"
.partition(/\d+(?=\D*\z)/) # => ["page.php?f=5&page=", "295", ""]
答案 3 :(得分:0)
{
"rules": {
"Users": {
"$user_id": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($user_id)
".write": "$user_id === auth.uid"
}
}
"$businessName": {
".write": "root.child('Users').child(auth.uid).child($businessName).child('Permissions').val() === 'MODERATOR'"
}
}
}
的步骤
def split_it(str)
str.reverse.partition(/\d+/).reverse.map(&:reverse)
end
split_it "index100.html"
#=> ["index", "100", ".html"]
split_it "page.php?id=100"
#=> ["page.php?id=", "100", ""]
split_it "page.php?f=5&page=295"
#=> ['page.php?f=5&page=', 295, '']
如下:
str = "page.php?f=5&page=295"