javascript - 为什么 JavaScript 正则表达式在我没有告诉它时捕获空格?

标签 javascript regex whitespace

使用以下代码:

var firefox = "Mozilla/5.0 (Android; Mobile; rv:32.0) Gecko/32.0 Firefox/32.0";
var chrome = "Mozilla/5.0 (Linux; Android 4.4.4; Nexus 4 Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.57 Mobile Safari/537.36";

var newf = firefox.replace(/.*?(Firefox|Chrome)\/([\d\.]*?)/, "$1 $2");
var newc = chrome.replace(/.*?(Firefox|Chrome)\/([\d\.]*?)/, "$1 $2");
console.log(newf);
console.log(newc);

我在控制台中得到这个:

Firefox 32.0
Chrome 38.0.2125.57 Mobile Safari/537.36 

我只想获取browser_name 版本。我做错了什么?

最佳答案

您的正则表达式没有考虑最后一个 Mobile Safari/537.36;作为vks pointed out正则表达式忽略最后一位,因为您的模式在 Chrome/38.0.2125.57 匹配后完全成功。

如果您将结束字符 ($) 添加到您的模式中,它就会失败并且问题会很明显。 replace()在 Javascript 中查找与正则表达式匹配的文本部分并替换它,而不是整个输入字符串。


您可以在末尾添加 .*“燃烧”最后的字符,从而使正则表达式匹配整行 从而导致替换以删除这些位。这还要求您通过删除 [\d\.]* 之后的 ? 使之前的匹配组成为非惰性匹配组。

我还会在模式的开头/结尾添加 ^$ 以表示输入字符串的开头和结尾(这是一种很好的形式) ),以及可选地添加 /gm,它告诉正则表达式匹配每一行(可能对您的情况有用),尽管这些添加都不是必需的。

/^.*?(Firefox|Chrome)\/([\d\.]*).*$/gm

关于javascript - 为什么 JavaScript 正则表达式在我没有告诉它时捕获空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25922292/

相关文章:

python - 在不删除python中的字符的情况下拆分具有不同条件的字符串

php - 重写 php switch 语句的 url

javascript - 如何检测 textContent 何时溢出其父级

c# - C#-从输入数字中删除空格以具有int

javascript - ExtJS EditorGridPanel 和列渲染器

javascript - 按第一个元素对嵌套数组进行分组

javascript - 添加 Assets 过滤器修复后 CakePHP 主题 CSS 和 JS 损坏

javascript - 从 Javascript/HTML 中动态创建的按钮读取值

java - 如何确定字符串是否不是正则表达式?

css 空白 :nowrap horizontal scroll bug