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


Regex to match one or three underscores like "(1_2)_(3_4)" or "(12)_(34)"

目前使用的regexp是:

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

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

parent_accounts_accounts.name works

Result: accounts accounts

parent_my_module_my_module.name不工作

结果:my_module_my module

期望:my_module my_module

我想你需要这样的东西:

/'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

第二个检查,如果你的第一部分有_,第二部分也必须有。

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

最常见的方法是所谓的转义字符。这样的字符通常是一个反斜杠'。当你写一个字符串,例如$str = "Hello world";,你想要你"在其中,你利用反斜杠的优势,你写$str = "Hello '"world'"";

我认为最好的解决方案是不允许在名称中使用下划线,并将它们显式地定义为限制符,这样您只需要对regexp进行一点修改:

/'bparent_([^_]+)_([^_]+)'.name/
演示

相关文章: