C++、Lua、Python字符串防止转义

发布时间 2023-07-05 13:29:50作者: 木可Muke

使用场景

  1. C++里测试路径需要转义,Windows复制路径里面的斜杠需要加斜杠,每次都需要操作比较麻烦,而且看着也不好看
  2. 换行,代码里有时候硬编码一些文本、数据,依赖""的自动拼接和行末的斜杠,需要手动写\r\n换行

C++ Raw string literal

以前用Lua,里有[[]],防止转义非常方便。
后来了解到Python也有r""
C++没怎么看到过这种用法,都是手动转义,突然想有没有这种特性,找了下C++还真有,C++11的新(误:老)特性。
https://en.cppreference.com/w/cpp/language/string_literal

prefix (optional) R"d-char-sequence (optional)(r-char-sequence (optional))d-char-sequence (optional)"

普通字符串

const char* s0 = "Hello";
const char* s1 = "C:\\name\\a\\b\\c";

禁止转义、自动补充换行的字符串

const char* s0 = R"(C:\name\a\b\c)";
const char* s1 = R"(
    C:\name\a\b\c
)";

C++中需要注意\r\n\n 等在不同平台的影响,待补充……

定义中还有一部分是d-char-sequence,这个部分既然可选,为什么需要它的存在呢,什么情况下需要写d-char-sequence
https://stackoverflow.com/questions/71550127/what-is-the-purpose-of-d-char-sequence-in-c-raw-strings

如果用户的字符串中包含默认的终止串)",则可以通过d-char-sequence自定义起始终止串,比如可以定义为)mySequence",由使用的人保证字符串中不出现自定义终止串。
d-char-sequence的最多16个字符,使用基础字符集的字符(不含小括号、斜杠\、空格)。在字符串小括号前指定,结尾和开头一致。

// x)"x
const char* s1 = R"mySequence(x)"x)mySequence";

Lua

普通字符串

local str = "Hello"
local str2 = "C:\\name\\a\\b\\c"

禁止转义、自动补充换行的字符串

local rstr = [[C:\name\a\b\c]]

local rstr2 = [[
    C:\name\a\b\c
]]

字符串中包含默认的终止串]],则自定义起始终止串,在两个中括号之间加n个=,起始和结束的=个数一致

local rsnconflict = [==[
    C:\name\a\b\c]]
]==]

Python

https://docs.python.org/3.13/tutorial/introduction.html#strings
普通字符串(单引号、双引号)

str0 = "Hello"
str1 = 'Hello'
str2 = "C:\\name\\a\\b\\c"

禁止转义(r)可以换行(三引号)的字符串

# 双引号字符串中的单引号不用转义,反之亦然
str1 = "''"
str2 = '""'

# 换行
rstr = """
C:\\name\\a\\b\\c
"""

# 禁止转义
rstr = r"C:\name\a\b\c"
rstr1 = r'C:\name\a\b\c'

# 禁止转义且自动包含换行(末尾加\防止换行)
rstr2 = r"""
C:\name\a\b\c
no End\
"""

字符串中包含默认的终止串"""或者''',可以用另一种引号代替。
如果两个都有,则可以用format或者+来拼接字符串,把和终止串一样的部分单独提出来,例子中把"""提出来,用单引号扩起来表示后,再format到目标字符串中(没有找到python自定义起始字符串的方式orz)

# 如果字符串包含以下五种类型(想使用r防止转义)
# '
# "
# C:\name\a\b\c
# """
# '''
tmp = '"""'
rsnconflict = fr"""
'
"
C:\name\a\b\c
'''
{tmp}
"""