我有以下内容
address.gsub(/^d*/, "").gsub(/d*-?d*$/, "").gsub(/# ?d*/,"")
这可以在一个gsub中完成吗?我想传递一个模式列表,而不仅仅是一个模式-它们都被相同的东西所取代。
您可以将它们与交替操作符(|
)组合:
address = '6 66-666 #99 11-23'
address.gsub(/^d*|d*-?d*$|# ?d*/, "")
# " 66-666 "
address = 'pancakes 6 66-666 # pancakes #99 11-23'
address.gsub(/^d*|d*-?d*$|# ?d*/,"")
# "pancakes 6 66-666 pancakes "
您可能需要添加更多的空白清理。你可能想要切换到:
/Ad*|d*-?d*z|# ?d*/
/Ad*|d*-?d*Z|# ?d*/
组合这些正则表达式是一个好主意——而且相对简单——但是我想推荐一些额外的更改。即:
address.gsub(/^d+|d+(?:-d+)?$|# *d+/, "")
在您的原始正则表达式中,^d*
和d*-?d*$
将始终匹配,因为它们不必消耗任何字符。所以你保证每行执行两次替换,即使那只是用空字符串替换空字符串。在我的正则表达式中,^d+
不会费心匹配,除非在行开头至少有一个数字,d+(?:-d+)?$
匹配在行末尾看起来像整数或范围表达式的内容。
您的第三个正则表达式# ?d*
将匹配任何#
字符,如果#
后面跟着空格和一些数字,它也会使用这些字符。根据您的其他正则表达式和我对其他问题的经验判断,我怀疑您只有在后跟一个或多个数字时才打算匹配#
,其中有可选的空格。这就是我的第三个正则表达式的作用。
如果我的任何猜测是错误的,请描述你试图做什么,我会尽我所能想出正确的正则表达式。但我真的不认为前两个正则表达式,至少,是你想要的。
EDIT(对评论的回答):当使用正则表达式时,您应该始终意识到不匹配的正则表达式和不匹配的正则表达式之间的区别。你说你要把正则表达式应用到街道地址。如果地址不恰好以门房号码开头,^d*
将不匹配任何内容——也就是说,它将报告一个成功的匹配,所述匹配由地址中第一个字符前面的空字符串组成。
这对你来说无关紧要,你只是用另一个空字符串替换它。但是为什么要费心去更换呢?如果将正则表达式更改为^d+
,它将报告匹配失败,并且不会执行替换。结果都是一样的,但是"匹配记录"场景(^d*
)会导致"不匹配"场景所避免的大量额外工作。在高吞吐量的情况下,这可能是一个救命稻草。
其他两个正则表达式带来了额外的复杂性:d*-?d*$
可以匹配字符串末尾的连字符(例如"123-"
,甚至"-"
);# ?d*
可以匹配字符串中的任何散列符号,而不仅仅是公寓/办公室号码的一部分。你知道你的数据,所以你可能知道这两个问题都不会出现;我只是想让你知道。我的正则表达式d+(?:-d+)?$
处理尾随连字符问题,# *d+
至少确保哈希符号后面有数字。
我认为,如果您将它们组合在一个单独的gsub()正则表达式中,作为替代,
它改变了起始搜索位置的上下文。
的结果开始正则表达式替换。
s/^d*//g
s/d*-?d*$//g
s/# ?d*//g
和s/^d*|d*-?d*$|# ?d*//g
在最后一个匹配停止的地方继续搜索/替换,并且可能产生不同的总体输出,特别是因为许多子表达式搜索相似的
如果不是相同的字符,则仅通过行锚来区分。
我认为你的正则表达式在这种情况下是足够独特的,当然改变顺序