在正则表达式中,如果第一个括号没有';如果不匹配,那么在JavaScript中使用replace()与在Ruby中使用gsub时,$1可以是空字符串吗?

在正则表达式中,如果第一个括号没有';如果不匹配,那么在JavaScript中使用replace()与在Ruby中使用gsub时,$1可以是空字符串吗?,javascript,ruby,regex,Javascript,Ruby,Regex,使用JavaScript,要从foo.bar中提取前缀foo.,包括,我可以使用: > "foo.bar".replace(/(\w+.)(.*)/, "$1") "foo." 但如果没有这样的前缀,我希望它给出一个空字符串或null,但它给出的是完整字符串: > "foobar".replace(/(\w+.)(.*)/, "$1") "foobar" 为什么$1会给出整个字符串?--我以为这是第一个括号 也许这意味着第一个括号实际上是匹配的 如果#1为真,那么可能一种常见的标

使用JavaScript,要从
foo.bar
中提取前缀
foo.
,包括
,我可以使用:

> "foo.bar".replace(/(\w+.)(.*)/, "$1")
"foo."
但如果没有这样的前缀,我希望它给出一个空字符串或null,但它给出的是完整字符串:

> "foobar".replace(/(\w+.)(.*)/, "$1")
"foobar"
为什么
$1
会给出整个字符串?--我以为这是第一个括号

  • 也许这意味着第一个括号实际上是匹配的
  • 如果#1为真,那么可能一种常见的标准技术是使用在Ruby中工作的

    使用内部评级法:

    > "foo.bar".gsub(/(\w+\.)?(.*)/, '\1')
    "foo."
    > "foobar".gsub(/(\w+\.)?(.*)/, '\1')
    ""
    
    因为
    是可选的,它无论如何都会匹配。但是,它在JavaScript中不起作用:

    > "foobar".replace(/(\w+.)?(.*)/, "$1")
    "foobar"
    
    我可以在JavaScript中使用
    match()
    ,它会非常干净,但只是为了理解
    replace()
    更多:

  • 是什么原因导致它在Ruby和JavaScript中的工作方式不同,以及上面的第1和第2条是否也适用和/或如果使用
    replace()
    不存在前缀,那么“获取”前缀或获取
    的好方法是什么


  • JavaScript中的replace方法为您提供了原始字符串的副本,无论您是否成功更改了它

    例如:

    alert( "atari.teenageRiot".replace(/5/,'reverse polarity of the neutron flow') );
    //"atari.teenageRiot"
    
    替换不是查找匹配项。它是通过用第二个参数替换与第一个参数匹配的内容来更改字符串的,因此无论是否更改,始终返回要更改的字符串

    此外,我将使用此选项:

    "foo.bar".replace(/(\w+\.)(.*)/, "$1")
    

    您在
    之前没有
    ,因此它被视为匹配大多数字符的通配符。

    仅供参考,我认为您的JavaScript的正则表达式不正确,因为它没有转义
    (点)字符

    $1
    返回整个字符串的原因是
    $1
    欺骗您相信它与第一组匹配(这不是真的)

    这是因为
    $1
    (空)
    不匹配,因此正则表达式尝试将原始字符串
    foobar
    替换为
    $1
    (因为它与任何内容都不匹配,所以只返回整个原始字符串。要使其清除,请查看以下示例

    "foobar".replace(/(\w+\.)/, '-');    // 'foobar' (No matches, so nothing get replaced)
    "foobar".replace(/(\w+\.)/, '$1');   // 'foobar' (No matches, $1 is empty, nothing get replaced)
    "foobar.a".replace(/(\w+\.)/, '-');  // '-a' (matches 'foobar.' so replaces 'foobar.' with '-') + ('a')
    "foobar.a".replace(/(\w+\.)/, '$1'); // 'foobar.a' (matches 'foobar.' so replaces 'foobar.' with itself) + ('a')
    

    “/[^$]/匹配任何不是字符串结尾的内容”?不,不匹配。它匹配任何不是
    $
    (美元符号)的内容。在
    […]内部
    ,通常情况下,$作为线端锚点的特殊含义会丢失,并成为它的文字字符。请参阅“doh。谢谢提醒。这可能在某个时候起到了作用,我把“u”和“mption”弄得一团糟。”
    "foobar".replace(/(\w+\.)/, '-');    // 'foobar' (No matches, so nothing get replaced)
    "foobar".replace(/(\w+\.)/, '$1');   // 'foobar' (No matches, $1 is empty, nothing get replaced)
    "foobar.a".replace(/(\w+\.)/, '-');  // '-a' (matches 'foobar.' so replaces 'foobar.' with '-') + ('a')
    "foobar.a".replace(/(\w+\.)/, '$1'); // 'foobar.a' (matches 'foobar.' so replaces 'foobar.' with itself) + ('a')