正则表达式获取最后一次出现数字之前和之后的所有内容

时间:2016-07-26 15:36:14

标签: ruby regex

我试图构建一个在最后一次出现数字之前和之后拆分的正则表达式。我希望得到:

"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="]

如何修改正则表达式以使其适用于第三种情况?

4 个答案:

答案 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"