【问题标题】:Regexp underscore infront of capital letters大写字母前的正则表达式下划线
【发布时间】:2014-10-16 06:11:15
【问题描述】:

我创建了这个正则表达式,如果它位于字符串的开头,它将在所有大写字母的前面添加一个下划线

$string = preg_replace('/(?!^)[A-Z]/', '_$0', $string);
// Hello --> Hello
// HelloHello --> Hello_Hello
// aHelloHello --> a_Hello_Hello
// HELLO --> H_E_L_L_O
// hello --> hello
// HHEllo --> H_Hello

我希望正则表达式跳过字符串开头的所有连续大写字符:

// HHello --> HHello
// HEllO --> HEll_O
// aHEllo --> a_H_Ello
// HHHHHHHHHHellO --> HHHHHHHHHHell_O

简而言之:一个正则表达式,在所有大写字母前添加下划线,但忽略字符串开头的所有连续大写字母。

【问题讨论】:

    标签: php regex string


    【解决方案1】:

    正则表达式:

    ^[A-Z]+(*SKIP)(*F)|[A-Z]
    

    替换字符串:

    _$0
    

    DEMO

    如果你想在 python 中做同样的事情,那么你需要使用regex 模块,它允许量词在后面,

    >>> import regex
    >>> m = regex.sub(r'(?<!^[A-Z]+|^)([A-Z])', r'_\1', 'HHHHHHHHHHHHHeLLO')
    >>> m
    'HHHHHHHHHHHHHe_L_L_O'
    

    【讨论】:

    • 这似乎做得很完美,你能描述一下这句话是怎么回事。正则表达式对我来说看起来很奇怪。我很快就会给你正确的答案。 :)
    • 对不起,我是从我的手机上发布的。正则表达式的实际作用是,它会在开头跳过所有连续的大写字母并匹配其他大写字母。
    • 是的,我测试了它,效果很好,我想知道 (*SKIP) 和 (*F) 的作用,这些对我来说是不熟悉的命令。
    • 如何在 python re.As 中做到这一点。*SKIP 和 *F 函数在 perl 中而不是在 python 中?
    • @vks op 为这个问题添加了标签 php。 PHP 支持 PCRE 库。
    【解决方案2】:

    不确定我是否完全理解了这个问题,但是如何:

    $string = preg_replace('/([a-z])([A-Z])/', '$1_$2', $string);
    

    【讨论】:

    • 这几乎可以工作,“HHellO”变成“HHell_O”,因为它在开始时跳过了双大写,但是如果你做“heLLo”,它会变成“he_LLo”,而它应该是“he_L_Lo”。它应该只在字符串的开头跳过连续的大写字母。
    • 我不知道为什么stackoverflow在“heLLo”示例中隐藏了下划线,空格是下划线。
    【解决方案3】:

    我认为这就是你想要做的:

    $string = preg_replace('/(?<=[a-z])[A-Z]/', '_$0', $string);
    

    【讨论】:

    • 是的,我不想要第一个下划线。下划线只能出现在第一个小写字母右侧的大写字母上。
    • 那条评论,加上大写字母不应该有下划线,让我相信你实际上想要每个小写字母和大写字母之间都有一个下划线。改变了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2015-04-28
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多