目前使用的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_module
或my_module_my module
。当您允许名称包含限制符(在您的示例中为_
)时,就会发生这种情况。
最常见的方法是所谓的转义字符。这样的字符通常是一个反斜杠'
。当你写一个字符串,例如$str = "Hello world";
,你想要你"
在其中,你利用反斜杠的优势,你写$str = "Hello '"world'"";
。
我认为最好的解决方案是不允许在名称中使用下划线,并将它们显式地定义为限制符,这样您只需要对regexp进行一点修改:
/'bparent_([^_]+)_([^_]+)'.name/
演示