正则表达式匹配一个或三个下划线,如"(1_2)_(3_4)"或"(12)_(34)"

时间:2015-07-23 11:51:05

标签: php regex

目前使用的正则表达式是:

/(^|[\s(])parent_(\w+)_(\w+)\.name/

如果匹配的单词中有下划线,则会发生碰撞。 有没有一种简单的方法来处理这个问题?

parent_accounts_accounts.name有效

结果:accounts accounts

parent_my_module_my_module.name不起作用

结果:my_module_my module

预期:my_module my_module

2 个答案:

答案 0 :(得分:1)

您的方法存在问题:您需要定义名称中包含多少个下划线。例如,在您的示例parent_my_module_my_module.name中,regexp匹配器不知道输出应该是my module_my_modulemy_module my_module还是my_module_my module。当您允许名称包含限制器(在您的情况下为_)时会发生这种情况。

最常见的方法是escape characters。这样的角色通常是反斜杠\。当你写一个字符串,例如$str = "Hello world";并且你想要",你可以利用反斜杠并写下$str = "Hello \"world\"";

我认为最好的解决方案是禁止在名称中使用下划线并将其明确定义为限制器,这样您只需要对正则表达式进行一些修改:

/\bparent_([^_]+)_([^_]+)\.name/

Demo

答案 1 :(得分:1)

我认为你需要这样的东西:

/\bparent_([a-z]+_?[a-z]+)_([a-z]+_?[a-z]+).name/ig

/\bparent_((([a-z]+_[a-z]+)_([a-z]+_[a-z]+))|(([a-z]+)_([a-z]+)))\.name/ig

第二部分检查如果你的第一部分有_,第二部分也必须有。{/ p>