Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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
Javascript RegExp:识别较差的正则表达式_Javascript_Regex_String - Fatal编程技术网

Javascript RegExp:识别较差的正则表达式

Javascript RegExp:识别较差的正则表达式,javascript,regex,string,Javascript,Regex,String,我正在使用正则表达式,我只是好奇RegExp的作者如何通过他们编写的模式识别改进。例如,这里有一个识别简单货币表达式的模式(为了简单起见,省略文字符号或AS2/AS3标识符)。对我来说,这看起来非常简洁,在JS环境中运行时,它准确地识别了我的测试用例。然而,我可以看到我使用了3个IF/ELSE语句,也许正是这个用例使我的表达式比应该或需要的更长。对于RegExp优化,是否有一般的经验法则?还是仅仅是语言的本质让我们认为“如果它起作用,那就是正确的表达” 感谢阅读和您的反馈、建议或评论 RegEx

我正在使用正则表达式,我只是好奇RegExp的作者如何通过他们编写的模式识别改进。例如,这里有一个识别简单货币表达式的模式(为了简单起见,省略文字符号或AS2/AS3标识符)。对我来说,这看起来非常简洁,在JS环境中运行时,它准确地识别了我的测试用例。然而,我可以看到我使用了3个IF/ELSE语句,也许正是这个用例使我的表达式比应该或需要的更长。对于RegExp优化,是否有一般的经验法则?还是仅仅是语言的本质让我们认为“如果它起作用,那就是正确的表达”

感谢阅读和您的反馈、建议或评论

RegExp模式:

/((\s\.){1})|((\d+){1})((\.\d+|\,\d+)|(\d+)){1,}/
RegExp细分:

/* A */ ((\s\.){1}) /** whitespace followed by period once **/

/* B */ ((\d+){1}) /** any number of digits occurs once before broken pattern **/       

((\s\.){1})|((\d+){1}) /** either pattern A or B **/

/* C */ (\.\d+|\,\d+) /** either period or comma preceeding a pattern of digits **/

/* D */ (\d+) /** any number of digits occurs before broken pattern **/

((\.|\,)|(\d+)){1,} /** either pattern A or B repeated at least once **/

/* Final */

((\s\.){1})|((\d+){1})((\.\d+|\,\d+)|(\d+)){1,}

“如果它起作用,那就是正确的表达”——如果它起作用,那肯定是正确的。谢谢你的反馈@zerkms!如果你想识别一个不好的正则表达式的迹象,你可以把使用量词
{1}
的正则表达式放在最上面的列表中。一般来说,尝试限制分支的数量
asdasd | dfgdfgfg | dfgfdgdgdg | dfgfg | | | | | | | | | | | | | | | | | | | | | | | | | | | | 124。一般来说,尝试跟踪所有无用的东西,(无用的量词,无用的捕获组
((((aaaaa)))
,捕获组仅在您想要捕获某些东西时有用,否则使用非捕获组)。您可能可以这样编写相同的模式:
\s\.\d+(?:[,]\d+)*
如果您想限制最后一次替换的影响,您可以使用以下技巧:
(?=[\s\d])(?:\s\.\d+(?:[,]\d+)
快速放弃字符串中所有不以空格或数字开头的位置,而无需尝试替换的两个分支。“如果有效,则是正确的表达式”---如果它能工作,那肯定是正确的。谢谢你的反馈@zerkms!如果你想识别一个不好的正则表达式的迹象,你可以把使用量词
{1}
的正则表达式放在最上面的列表中。一般来说,尝试限制分支的数量
asdasd | dfgdfgfg | dfgfdgdgdg | dfgfg | | | | | | | | | | | | | | | | | | | | | | | | | | | | 124。一般来说,尝试跟踪所有无用的东西,(无用的量词,无用的捕获组
((((aaaaa)))
,捕获组仅在您想要捕获某些东西时有用,否则使用非捕获组)。您可能可以这样编写相同的模式:
\s\.\d+(?:[,]\d+)*
如果您想限制最后一次替换的影响,可以使用以下技巧:
(?=[\s\d])(?:\s\.\d+(?:[,]\d+)
快速放弃字符串中所有不以空格或数字开头的位置,而无需尝试替换的两个分支。