Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Regexp替换字符串中的所有点,圆括号之间的点除外_Regex - Fatal编程技术网

Regexp替换字符串中的所有点,圆括号之间的点除外

Regexp替换字符串中的所有点,圆括号之间的点除外,regex,Regex,我正在尝试找到正确的regexp来执行以下操作: 输入:“$MM.Player.Panning(1,0.1)”; 输出“$MM->玩家->平移(1,0.1)” 如果不替换圆括号之间的点,我想不出如何将点替换为“->” 如果您有任何意见或建议,我们将不胜感激。一个建议是:(因为您可能会在括号中传递数字,而括号外的点被非数字包围) 尝试(\D)\(\D)并替换为$1->$2最好的解决方案是不使用regexp 尝试一个解析字符串的小函数,如下所示: (PHP中的函数,我不知道您使用的是什么语言) 函数

我正在尝试找到正确的regexp来执行以下操作:

输入:“$MM.Player.Panning(1,0.1)”; 输出“$MM->玩家->平移(1,0.1)”

如果不替换圆括号之间的点,我想不出如何将点替换为“->”

如果您有任何意见或建议,我们将不胜感激。

一个建议是:(因为您可能会在括号中传递数字,而括号外的点被非数字包围)


尝试
(\D)\(\D)
并替换为
$1->$2
最好的解决方案是不使用regexp

尝试一个解析字符串的小函数,如下所示:

(PHP中的函数,我不知道您使用的是什么语言)

函数dotplacer($string){
$圆括号=0;//计数是否在圆括号内。
$listOfDots=array();//包含要替换点的$string索引列表。
$listofements=array();//这些点之间的元素列表。例如:$MM,Player和Panning(1,0.1)
$newString='';//要返回的新字符串。
对于($i=0;$i',$listofements);//返回元素之间带有'->'的内爆元素列表。
}
我试过了,效果很好。你的输入和输出是正确的。

彼得,你说:

如果你有一个更简单,更小的解决方案,我还是想知道

简单得多、小得多行吗?:)

以下是整个解决方案:

$regex = '~\([^)]*\)(*SKIP)(*F)|(\.)~';
$subject = '$MM.Player.Panning(1, 0.1)';
$replaced = preg_replace($regex,"->",$subject);
你的情况完全不一样。我们使用这个简单的正则表达式:

\([^)]*\)(*SKIP)(*F)|\.
交替的左侧匹配complete
(括号内的表达式)
,然后故意失败并跳过字符串的该部分。右侧匹配点,我们知道它们是右侧的点,因为它们与左侧的表达式不匹配

这些是我们需要替换的点。您可以在页面底部看到结果

参考


@Peter Elzinga,只有当您要保留的
是数字时,该选项才有效。你确定这是你想要的吗?另外:要小心,它不能与
平移(1,0.)一起工作。
。这就成功了。。。无法使用regexp生成器获取此…**有时间时需要学习regexp**Thnks@Oltarus其他函数确实需要包含字符串的json字符串,因此用户输入的字符串可能包含点。您是否有更好的解决方案来防止由于无效输入而导致的错误?@Oltarus;我把两部分分开:函数部分和参数部分。然后我用Sudimail给我的regexp替换点,然后我把两部分放回一起:
preg\u match('/(\\().*(\\)/',$string,$matches,preg\u OFFSET\u CAPTURE)$func=substr($string,0,$matches[0][1])$func=preg\u replace('/(\D)\.(\D)/','$1->$2',$func)$字符串=$func.$matches[0][0]
@Oltarus如果你有一个更简单、更小的解决方案,我仍然想知道注意:所有类型的数据都在圆括号之间传递,包括json字符串,它可能包含字符串本身。嘿,Oltarus。为什么我不应该使用regexp和您的脚本,而您的脚本要复杂得多?因为regexp并不是在所有情况下都能工作。我的剧本是这样的。现在,如果您使用非常精确的语法,例如,您只需要识别小数点,请使用regexp。我的脚本也适用于像
gpd.ar(gfo.ffe).p2v这样的字符串→ <代码>gpd->ar(gfo.ffe)->p2v
。这真的取决于你,我只是简单地对你的问题给出了一个完整的答案…我很高兴创建了这个脚本,这可能是我在这个过程中的主要目标。啊哈,这就清楚了。但我的解决方案在我的情况下已经足够了,所以我将使用它;)
\([^)]*\)(*SKIP)(*F)|\.