- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下字符串:
std::string s("server ('m1.labs.teradata.com') username ('use\\')r_*5') password('u\" er 5') dbname ('default')");
我使用了以下代码:
int main() {
std::regex re(R"('[^'\\]*(?:\\[\s\S][^'\\]*)*')");
std::string s("server ('m1.labs.teradata.com') username ('use\\')r_*5') password('u\" er 5') dbname ('default')");
unsigned count = 0;
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), re);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
cout << "the token is"<<" "<< m.str() << endl;
count++;
}
cout << "There were " << count << " tokens found." << endl;
return 0;
以上字符串的输出是:
the token is 'm1.labs.teradata.com'
the token is 'use\')r_*5'
the token is 'u" er 5'
the token is 'default'
There were 4 tokens found.
现在如果上面代码中提到的字符串s是
std::string s("server ('m1.labs.ter\'adata.com') username ('use\\')r_*5') password('u\" er 5') dbname ('default')");
输出变为:
the token is 'm1.labs.ter'
the token is ') username ('
the token is ')r_*5'
the token is 'u" er 5'
the token is 'default'
There were 5 tokens found.
现在两个字符串的输出不同:预期的输出是“提取括号和单引号之间的所有内容,即
the token is 'm1.labs.teradata.com'
the token is 'use\')r_*5'
the token is 'u" er 5'
the token is 'default'
There were 4 tokens found
我在代码中提到的正则表达式能够正确提取但无法转义“单引号”。它能够转义 ",) 等但不能转义单引号。可以修改正则表达式以产生我需要的输出吗?提前致谢。
最佳答案
您使用的是我昨天通过评论分享的正确正则表达式。它匹配可能在内部转义了单引号的单引号字符串文字。
std::regex re(R"('([^'\\]*(?:\\[\s\S][^'\\]*)*)')");
std::string s("server ('m1.labs.teradata.com') username ('u\\'se)r_*5') password('uer 5') dbname ('default')");
unsigned count = 0;
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), re);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
cout << "the token is"<<" "<< m.str(1) << endl;
count++;
}
cout << "There were " << count << " tokens found." << endl;
这里是 my C++ demo
请注意,文字字符串 ('u\'se)r_*5')
应该像这样使用常规字符串文字定义,其中支持转义序列 where文字反斜杠应使用 \\
:
"('u\\'se)r_*5')"
或使用原始字符串文字,其中反斜杠表示文字反斜杠:
R"(('u\'se)r_*5'))"
R"(...)"
形成原始字符串文字。
图案细节:
'
- 单引号[^'\\]*
- 除了单引号和反斜杠之外的 0+ 个字符(?:\\[\s\S][^'\\]*)*
- 零个或多个序列:
\\[\s\S]
- 任何反斜杠转义字符[^'\\]*
- 除了 '
和 \
'
- 单引号。请注意,为了避免将第一个单引号匹配为转义引号,您需要调整表达式,如 this snippet :
std::regex re(R"((?:^|[^\\])(?:\\{2})*'([^'\\]*(?:\\[\s\S][^'\\]*)*)')");
std::string s("server ('m1.labs.teradata.com') username ('u\\'se)r_*5') password('uer 5') dbname ('default')");
unsigned count = 0;
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), re);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
cout << "the token is"<<" "<< m.str(1) << endl;
count++;
}
cout << "There were " << count << " tokens found." << endl;
(?:^|[^\\])(?:\\{2})*
前缀将匹配字符串的开头或除 \
之外的任何字符> 然后是 2 个 \
的 0+ 序列,因此首先不会抓取任何转义的 '
。
最后,如果您只需要将匹配列表放入 vector 中,您可以使用
#include <iostream>
#include <string>
#include <vector>
#include <regex>
using namespace std;
int main() {
std::regex rx("'[^']*(?:''[^']*)*'");
std::string sentence("server ('m1.labs.\\''tera\"da ta.com') username ('us *(er'')5') password('uer 5') dbname ('default')");
std::vector<std::string> names(std::sregex_token_iterator(sentence.begin(), sentence.end(), rx),
std::sregex_token_iterator());
for( auto & p : names ) cout << p << endl;
return 0;
}
参见 C++ demo .
关于c++ - 正则表达式中的转义 (\') 单引号在两个单引号之间采用字符串。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45207532/
在线编写 yacc 代码的教程使用单引号表示分号和其他字符: ';' '+' '-' (etc) 但是在使用时: '' 在我将其更改为双引号之前,我遇到了错误: "" 相似地, '>=' '==
MySQL documentation说它应该是\'。然而,scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办? 最佳答案 您引用的 MySQL 文档实际上比您提到的要多一些
MySQL documentation说它应该是\'。然而,scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办? 最佳答案 您引用的 MySQL 文档实际上比您提到的要多一些
MySQL documentation说它应该是\'。然而,scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办? 最佳答案 您引用的 MySQL 文档实际上比您提到的要多一些
MySQL documentation说它应该是\'。然而,scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办? 最佳答案 您引用的 MySQL 文档实际上比您提到的要多一些
我一直在使用 SED (Bash shell) 转义单引号问题。 我需要做 $cfg['Servers'][$i]['password'] = ''; 进入 $cfg['Servers'][$i]['
需要将'替换为\'但这就是我得到的: >>> s = "It's nice to have an example" >>> s.replace("'", "\\'") "It\\'s nice to
我在处理连接字符串中的 ' 字符时遇到问题。 Entity Framework 抛出异常说: Format of the initialization string does not conform
我遇到了一个非常奇怪的问题,我无法设置 Content-Security-Policy 所需的单引号。我假设我运行的是旧版本的 ingress,它仅在我禁用并重新启用它 (microk8s) 后才得到
插入带有撇号的值的正确 SQL 语法是什么? Insert into Person (First, Last) Values 'Joe', 'O'Brien' 我不断收到错误,因为我认为
我有三列数据 selector label option list time you personally
我使用 Java Pattern 类将正则表达式指定为字符串。 举个例子我喜欢成为蜘蛛侠:“彼得·帕克” 应将蜘蛛侠和“Peter Parker”列为单独的标记。谢谢 try { Buffe
我正在尝试删除标记 ' (单引号)但我不知道如何。 我在做delm \'但它不起作用。我也尝试了我能想到的所有组合。 我意识到这更像是一个 Vim 脚本问题,但我在任何地方都找不到。 最佳答案 为什么
如何禁用红色突出显示的特定实例。 我尝试在单引号前输入转义符,但没有成功。我确信单引号导致了红色突出显示,因为当我删除它时,它就会消失。 代码如下: import React from 'react'
我需要输出单引号 (')。它必须是单引号而不是 ',因为这是用于向 jquery 函数提供数据的字符串的一部分。 我使用 C# 循环遍历一个对象来构建一个字符串 "var data = [['Item
我正在尝试: "l'ape"); ?> var my_javascript_object = jQuery.parseJSON(''); 我收到此错误“未捕获的语法错误:意外的标识符”。问题是
我的问题是关于传递给方法验证的“add\”反斜杠单引号,该反斜杠单代码有什么用? document.writeln('\',\'N\'))>'); 最佳答案 欢迎来到堆栈溢出。 反斜杠告诉代码这不是引
我要执行命令: xcodebuild -exportArchive -exportFormat IPA -archivePath myApp.xcarchive -exportPath myApp.i
我有一个字符串,里面有一个 ': example link text 不幸的是,这似乎不起作用。 Firebug 提示“SyntaxError:参数列表后缺少 )”,您可以看到 HTML 实体已被 '
据我所知,'mars%22%3A%22' 和 "mars%22%3A%22" 是等效的,因为没有任何内容被转义. 我创建 javscript 书签已经有一段时间了。有一次,当按原样粘贴到 Chrome
我是一名优秀的程序员,十分优秀!