Php 正则表达式匹配一个或三个下划线,如;(1)(2)(3)";或;(12) (34)";
当前使用的regexp是:Php 正则表达式匹配一个或三个下划线,如;(1)(2)(3)";或;(12) (34)";,php,regex,Php,Regex,当前使用的regexp是: /(^|[\s(])parent_(\w+)_(\w+)\.name/ 现在,如果要匹配的单词中有下划线,则会发生冲突。 有没有一个简单的方法来处理这个问题 parent\u accounts\u accounts.name有效 结果:账户 parent\u my\u module\u my\u module.name不起作用 结果:我的模块\u我的模块 预期:my\u module my\u module您的方法中存在一个问题:您需要定义一个名称可以包含多少下划线
/(^|[\s(])parent_(\w+)_(\w+)\.name/
现在,如果要匹配的单词中有下划线,则会发生冲突。
有没有一个简单的方法来处理这个问题
parent\u accounts\u accounts.name
有效
结果:账户
parent\u my\u module\u my\u module.name
不起作用
结果:我的模块\u我的模块
预期:
my\u module my\u module
您的方法中存在一个问题:您需要定义一个名称可以包含多少下划线。例如,在您的示例中,parent\u my\u module\u my\u module.name
regexp matcher不知道输出是否应为my module\u my\u module
、my\u module my\u module
。当您允许一个名称包含一个限制器时,就会发生这种情况(\uu
)
最常见的方法是所谓的。这样的字符通常是反斜杠\
。当您编写字符串时,例如,$str=“Hello world”
如果您想在其中使用“
,您可以利用反斜杠编写$str=“Hello\”world\”;
我认为最好的解决方案是在名称中不允许下划线,并将它们明确定义为限制器,这样您只需要对regexp进行一点修改:
/\bparent_([^_]+)_([^_]+)\.name/
我想你需要这样的东西:
/\bparent_([a-z]+_?[a-z]+)_([a-z]+_?[a-z]+).name/ig
或
第二个检查你的第一部分是否有一个
,第二部分也必须有它。应该如何处理parent\u my\u other\u module.name
呢?它的哪一部分是常量,哪一部分是动态的?我想如果其中一个单词包含下划线,另一个也会有。所以parent\u my\u other\u module.name希望不会发生“parent_uu”中间的“u”和“.name”是常量。问题是我想对软件进行一点错误修复(sugarcrm)因此,如果没有可能的正则表达式,那么如果使用包含的下划线,我可能使用IF。@ GunNi然后考虑使用不同的限幅器。您可以使用<代码> ->代码>代替<代码> <代码>吗?那么您将拥有<代码> /\bPrim-([^ -+])-([^ -] +)。\.name/
并且您可以在名称中使用任意多的下划线:)我不能轻松地交换分隔符,但上面的shA.t答案帮助我解决了这个问题。编辑之前的第一个更好,因为它将结果保持在结果中的相同位置。因此,现在我使用:/(^ |[\s(])parent.[a-zA-Z]+.[a-zA-Z]+.[a-zA-Z]++.[a-zA-Z]+\.name/
/\bparent_((([a-z]+_[a-z]+)_([a-z]+_[a-z]+))|(([a-z]+)_([a-z]+)))\.name/ig