Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式匹配一个或三个下划线,如;(1)(2)(3)";或;(12) (34)";_Php_Regex - Fatal编程技术网

Php 正则表达式匹配一个或三个下划线,如;(1)(2)(3)";或;(12) (34)";

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您的方法中存在一个问题:您需要定义一个名称可以包含多少下划线

当前使用的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

您的方法中存在一个问题:您需要定义一个名称可以包含多少下划线。例如,在您的示例中,
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