老实说,原始字符串文字是C++语言的一个很好的补充.但是(正如预期的那样)编辑们很难正确地展示这些文字.
我正在使用Vim 7.4和开箱即用的原始字符串文字完全打破语法高亮.例如在
char const txt[] = R"(printf(")";
Run Code Online (Sandbox Code Playgroud)
第二个'('在vim中突出显示为红色.
就像是
char const txt2[] = R"( "{{" )";
Run Code Online (Sandbox Code Playgroud)
打破花括号的突出显示和基于语法的自动识别 - 依此类推.
首先,我很乐意让Vim忽略语法高亮之间R"(和之间的所有)"内容.
但请注意,原始字符串文字是灵活的 - 在第一个/最后一个双引号/括号对之间允许任意匹配字符串,例如
R"abcd()")")abcd"
Run Code Online (Sandbox Code Playgroud)
也是一个有效的原始字符串文字编码
)")"
另请参阅cppreference链接以获取语法的一般定义.
因此,我的问题是如何配置Vim,以便正确识别C++原始字符串文字.
Vim似乎已经包含了一些正确的synatx功能,突出了嵌入在宿主语言中的语言片段(例如,对于编译器 - 编译器源文件).也许它们也可以用于原始字符串文字案例?
三重行情
'''
This is a
multi-line
string.
'''
Run Code Online (Sandbox Code Playgroud)
串联
('this is '
'a string')
Run Code Online (Sandbox Code Playgroud)
逃跑
'This is'\
'a string'
Run Code Online (Sandbox Code Playgroud)
我也知道在字符串前面加上前缀r会使它成为原始字符串,对文件路径很有用。
r'C:\Path\To\File'
Run Code Online (Sandbox Code Playgroud)但是,我有一个很长的文件路径,它跨越多行并且需要是一个原始字符串。我该怎么做呢?
这有效:
In [1]: (r'a\b'
...: '\c\d')
Out[1]: 'a\\b\\c\\d'
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,这不会:
In [4]: (r'on\e'
...: '\tw\o')
Out[4]: 'on\\e\tw\\o'
Run Code Online (Sandbox Code Playgroud)
为什么"t"只有一个反斜杠?
string raw_str = R"(R"(foo)")";
Run Code Online (Sandbox Code Playgroud)
如果我有R"()"一个原始字符串,这会导致解析器混淆.(即,它认为最左边)"是原始字符串的结尾.
我怎么逃避这个?
最新的C++ 0x草案n3126说:
删除反斜杠字符(\)后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.
...
在原始字符串文字的r-char序列中,将恢复在阶段1和2中执行的任何转换(三字符,通用字符名称和行拼接).
从技术上讲,这意味着C++预处理器只识别反斜杠后跟换行符,但我知道一些C++实现也允许Windows或经典Mac风格的行结尾.
是否需要符合C++ 0x的实现来保留紧跟\在原始字符串的r-char序列中的反斜杠字符的换行符序列?也许更好的问题是:是否需要Windows C++ 0x编译器来撤消每个行拼接"\\\r\n"而不是"\\\n"?
我不明白原始字符串文字是如何工作的.我知道在使用r它时会忽略所有特殊内容,比如在执行\n此操作时将其视为\n而不是新行.但后来我试着这样做:
x = r'\'
Run Code Online (Sandbox Code Playgroud)
它说SyntaxError: EOL while scanning string literal而不是'\'
为什么?我没弄错吗?以及对此的解释是什么:
print r'\\' # gives '\\'
print r'\\\' # gives SyntaxError
Run Code Online (Sandbox Code Playgroud) 我在以下代码中对原始字符串有一些困惑:
import re
text2 = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
text2_re = re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text2)
print (text2_re) #output: Today is 2012-11-27. PyCon starts 2013-3-13.
print (r'(\d+)/(\d+)/(\d+)') #output: (\d+)/(\d+)/(\d+)
Run Code Online (Sandbox Code Playgroud)
正如我理解原始字符串,没有r,\被视为转义字符; 使用r,反斜杠\被视为字体.
但是,我在上面的代码中无法理解的是:在正则表达式第5行中,即使有一个r,里面的" \ d "被视为一个数字[0-9]而不是一个反斜杠\加一个信d.
在第二个打印行8中,所有字符都被视为原始字符串.
有什么不同?
我做了以下四种变化,有或没有r:
import re
text2 = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
text2_re = re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text2)
text2_re1 = re.sub('(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text2)
text2_re2 = re.sub(r'(\d+)/(\d+)/(\d+)', …Run Code Online (Sandbox Code Playgroud) 抱歉,如果以前曾问过这个问题,我确实进行了搜索,但所有命中似乎都与python raw字符串有关,而不是argparse。
无论如何,我有一个代码,用户输入一个字符串,然后对该字符串进行处理。但是,我有一个问题,因为我希望我的代码能够区分\n和,\\n以便用户可以控制他们是否换行或\n分别出现在输出中。
这本身非常简单,并且我可以使逻辑工作来检查字符串等。但是,argparse似乎并没有保持输入字符串的原始状态。因此,如果我要写:Here is a list:\nItem 1它将解析为Here is a list:\\nItem 1。如果要在输入字符串中替换\n为\\n,则会解析出完全相同的事物,因此无法区分两者。
我可以包括bodge(例如,我可以让用户输入发言权$\n的\n出现在输出,或者只是\n一个换行符)。但这很麻烦,并使代码的使用复杂化。
有没有办法确保被argparse解析的字符串是原始的?(即,如果我输入\n它解析\n而不是\\n)
再次,很抱歉,如果以前曾有人问过这个问题,但是我找不到答案,经过一个多小时的尝试找到答案后,我没主意了(不要再犹豫了)。提前为任何和所有帮助加油。
示例代码(很抱歉,如果这不起作用,请不确定如何最好地为argparse做示例代码!):
import argparse
parser = argparse.ArgumentParser( description = 'Test.' )
parser.add_argument( 'text', action = 'store', type = str, help = 'The text to parse.' )
args = parser.parse_args( )
print( repr( args.text ) )
Run Code Online (Sandbox Code Playgroud) 编辑:原始字符串文字已从JDK 12中删除,但我将打开此问题并在重新引入Raw String Literals时相应地编辑它.
在测试Raw String Literals(这是Java 12中的预览功能)时,我遇到了以下代码片段:
System.out.println(`
Test 1
Test 2
Test 3
`);
Run Code Online (Sandbox Code Playgroud)
其中输出如下:
Test 1
Test 2
Test 3
Run Code Online (Sandbox Code Playgroud)
但是,我希望输出类似于以下内容:
Test 1
Test 2
Test 3
Run Code Online (Sandbox Code Playgroud)
删除前导缩进以匹配预期格式的最简单方法是什么?
R 4.0.0 为原始字符串引入了新语法:
r"(raw string here can contain anything except the closing sequence)"
Run Code Online (Sandbox Code Playgroud)
但是 R 3.xx 中的相同构造产生了语法错误:
错误:"r"(asdasd)"" 中的意外字符串常量
这是否意味着解释器在 R 4.0.0 中发生了变化。?
如果是这样 - R 4.0.0。提供一种机制来定义自定义函数,例如foo"()"?
原始字符串中的换行符是否依赖平台?
val a = "one\ntwo";
val b = """one
two"""
println(a == b)
Run Code Online (Sandbox Code Playgroud)
换句话说,println上面的陈述是否保证打印true?