- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我不明白这段 Ruby 代码:
>> puts '\\ <- single backslash'
# \ <- single backslash
>> puts '\\ <- 2x a, because 2 backslashes get replaced'.sub(/\\/, 'aa')
# aa <- 2x a, because two backslashes get replaced
到目前为止,一切都符合预期。但是如果我们用 /\\/
搜索 1,然后用 '\\\\'
编码的 2 替换,为什么我们会得到这个:
>> puts '\\ <- only 1 ... replace 1 with 2'.sub(/\\/, '\\\\')
# \ <- only 1 backslash, even though we replace 1 with 2
然后,当我们用 '\\\\\\'
编码 3 时,我们只得到 2:
>> puts '\\ <- only 2 ... 1 with 3'.sub(/\\/, '\\\\\\')
# \\ <- 2 backslashes, even though we replace 1 with 3
任何人都能够理解为什么反斜杠会被替换字符串吞没?这发生在 1.8 和 1.9 上。
最佳答案
如果您想避免所有这些混淆,使用更容易混淆的 block 语法。这是一个用 2 个反斜杠替换每个反斜杠的示例:
"some\\path".gsub('\\') { '\\\\' }
问题是,当使用 sub
(和 gsub
)时,如果没有 block ,ruby 会解释替换参数中的特殊字符序列。不幸的是,sub
使用反斜杠作为这些字符的转义字符:
\& (the entire regex)
\+ (the last group)
\` (pre-match string)
\' (post-match string)
\0 (same as \&)
\1 (first captured group)
\2 (second captured group)
\\ (a backslash)
与任何转义一样,这会产生一个明显的问题。如果你想在输出字符串中包含上述序列之一的文字值(例如 \1
),你必须对其进行转义。因此,要获得 Hello\1
,您需要替换字符串为 Hello\\1
。为了在 Ruby 中将其表示为字符串文字,您必须像这样再次转义那些反斜杠:"Hello\\\\1"
因此,有两种不同的转义过程。第一个采用字符串文字并创建内部字符串值。第二个采用该内部字符串值并将上面的序列替换为匹配数据。
如果反斜杠后面没有与上述序列之一匹配的字符,则反斜杠(和后面的字符)将不加改变地通过。这也会影响字符串末尾的反斜杠——它将不加改变地通过。在 rubinius 代码中最容易看到这个逻辑;只需在 String class 中查找 to_sub_replacement
方法即可.
以下是String#sub
如何解析替换字符串的一些示例:
1 个反斜杠 \
(其字符串文字为 "\\"
)
原封不动地通过,因为反斜杠位于字符串的末尾并且后面没有任何字符。
结果: \
2 个反斜杠 \\
(其字符串文字为 "\\\\"
)
这对反斜杠匹配转义的反斜杠序列(参见上面的 \\
)并被转换为单个反斜杠。
结果: \
3 个反斜杠 \\\
(其字符串文字为 "\\\\\\"
)
前两个反斜杠与 \\
序列匹配并转换为单个反斜杠。然后最后的反斜杠位于字符串的末尾,因此它可以原封不动地通过。
结果: \\
4 个反斜杠 \\\\
(其字符串文字为 "\\\\\\\\"
)
两对反斜杠分别匹配 \\
序列并转换为单个反斜杠。
结果: \\
中间有字符的 2 个反斜杠 \a\
(其字符串字面量为 "\\a\\"
)
\a
不匹配任何转义序列,因此允许它不加改变地通过。也允许尾随反斜杠。
结果: \a\
注意:可以从以下位置获得相同的结果:\\a\\
(文字字符串:"\\\\a\\\\"
)
事后看来,如果 String#sub
使用不同的转义字符,这可能不会那么困惑。这样就不需要双重转义所有反斜杠了。
关于ruby - Ruby 中奇怪的反斜杠替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1542214/
我有一个右下角倾斜的元素,我必须在其上放置一个盒子阴影。有时倾斜的 Angular 被徽章覆盖 - 我的问题不适用,如果是这样的话: 这是信息框及其边 Angular 的 (s)css 部分(还有更多
是否可以在纯 html/css 中创建类似下面的内容? 我想做这个响应式和全 (100%) 宽度(最大左 Angular 100 像素,右边最小 50 像素,类似的东西)。 最佳答案 您可以通过转换(
如何在 fabricjs 文本中为文本提供渐变或斜 Angular 效果?? http://fabricjs.com/fabric-intro-part-2/ 这里给出了形状和所有示例,我将其与文本绑
我用过: http://apps.eky.hk/css-triangle-generator/ 为彼此对 Angular 放置的两个不等边三 Angular 形生成 css: 左下三 Angular
我是一名优秀的程序员,十分优秀!