Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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
Ruby 替换非单词字符,除非给定的序列匹配_Ruby_Regex_String - Fatal编程技术网

Ruby 替换非单词字符,除非给定的序列匹配

Ruby 替换非单词字符,除非给定的序列匹配,ruby,regex,string,Ruby,Regex,String,我有这样一个字符串: "Jim-Bob's email @@@hl@@@address@@@endhl@@@ is: jb@example.com" 我想替换所有非单词字符(符号和空格),除了@@@@code>分隔符 我目前正在使用: str.gsub(/[^\w@]+/, 'X') 这将产生: "JimXBobXsXemailX@@@hl@@@address@@@endhl@@@XisXjb@exampleXcom" 在实践中,这已经足够好了,但它冒犯了我,原因有两个: 电子邮件地址中

我有这样一个字符串:

"Jim-Bob's email @@@hl@@@address@@@endhl@@@ is: jb@example.com"
我想替换所有非单词字符(符号和空格),除了
@@@@code>分隔符

我目前正在使用:

str.gsub(/[^\w@]+/, 'X')
这将产生:

"JimXBobXsXemailX@@@hl@@@address@@@endhl@@@XisXjb@exampleXcom"
在实践中,这已经足够好了,但它冒犯了我,原因有两个:

  • 电子邮件地址中的
    @
    不会被替换
  • [^\w]
    代替
    \w
    感觉很草率

如何替换所有非单词字符,除非这些字符构成了分隔符字符串。
@@@hl@或
@@@endhl@@
有关第二点,我认为你要求太多了;没有简单的方法可以避免这种情况

关于第一点,一个简单的方法是临时用一个永远不会使用的字符替换
“@@@@”
(假设您使用的系统没有
“\r”
,因此该字符不会被使用;我们可以将其用作临时替换)


这种方法使用了这样一个事实,即交替的工作方式类似于
case
structure:第一个匹配的字符串使用相应的字符串,然后不再对其进行进一步的匹配。因此,
@@@@.@@@
将使用一个标记(如
@@@hl@@
),它内部将不匹配任何其他字符。我们还匹配任何单词字符序列。如果捕获了其中任何一个字符,我们可以按原样返回它们(
$1
)。如果没有,则匹配任何其他字符(即不在标记内部,而不是单词字符)用“<代码> > X”/代码> /> P>替换字符串<代码> @ @ HL@ @ @ @ EnHL@ @ <代码> >我要重新表述我的问题:“字符串<代码> > @ @ HL@ @ @ EndHL@ @ <代码>?我会考虑伪数据和期望<代码> XXXHLXXXXXDEXHLXXX”。为什么不为未来的访问者发布一个简单的解释呢?我喜欢你的解决方案,但除非有人知道什么,否则它不是真正的答案……我应该在几个小时前发布这个问题。我花了比你多得多的时间思考如何解决它。非常感谢!我倾向于同意我第二点的迂腐本质,但是ught值得一提。我也确实考虑过两阶段搜索/替换,但为了可读性,我一直在尝试避免过多的字符串传递。感谢这些可靠的想法!
"Jim-Bob's email @@@hl@@@address@@@endhl@@@ is: jb@example.com"
.gsub("@@@", "\r").gsub(/[^\w\r]/, "X").gsub("\r", "@@@")
# => "JimXBobXsXemailX@@@hl@@@address@@@endhl@@@XisXXjbXexampleXcom"
str.gsub(/(@@@.*?@@@|\w+)|./) { $1 || "X" }
# => "JimXBobXsXemailX@@@hl@@@address@@@endhl@@@XisXXjbXexampleXcom"