ユーザーが "lw 2、3(9)"を入力したときに検出したいのですが、かっこを読み取ることができません。このコードを使用しましたが、かっこは検出されません。正規表現regexライブラリを使用してアセンブリlw/sw命令を表現する方法は?
{ R"((\w+) ([[:digit:]]+), ([[:digit:]]+) (\\([[:digit:]]+\\)))"}
誰かが助けてくれますか?
ユーザーが "lw 2、3(9)"を入力したときに検出したいのですが、かっこを読み取ることができません。このコードを使用しましたが、かっこは検出されません。正規表現regexライブラリを使用してアセンブリlw/sw命令を表現する方法は?
{ R"((\w+) ([[:digit:]]+), ([[:digit:]]+) (\\([[:digit:]]+\\)))"}
誰かが助けてくれますか?
R"((\w+) (\d+), (\d+)(\(\d+\)))"
は、あなたが何かをキャプチャするかしないかどうかを指定しませんでしたので、私は両方のスニペットを提供します私のため
そしてなぜあなたは括弧の中に '\ d'を使いましたか? '\ d' =' [[:digit:]] 'となります。 –
[0-9]のような "任意の数字"の場合、より簡潔に見えます。 – cokceken
はい、 '[[:digit:]]' = '\ d'、' [\ d] 'を書く必要はありません。実際、あなたの答えは私のものと同じですが、何の説明もありません。 –
あなたは、パターンの過度のスペースを注意する必要がある、とあなたはリテラル生の文字列を使用しているので、あなたは特殊文字をエスケープ倍増べきではありません。
R"((\w+) ([[:digit:]]+), ([[:digit:]]+)(\([[:digit:]]+\)))"
^^^ ^^^
文字通り交換するのは良い考えかもしれませんスペースは[[:space:]]+
です。 lw 2, 3(9)
を印刷
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main() {
regex rx(R"((\w+) ([[:digit:]]+), ([[:digit:]]+)(\([[:digit:]]+\)))");
string s("Text lw 2, 3(9) here");
smatch m;
if (regex_search(s, m, rx)) {
std::cout << m[0] << std::endl;
}
return 0;
}
を働きました。
(その場合は、生の文字列リテラルと文字をエスケープする必要はありませんが、キャプチャグループ
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::string str = "lw 2, 3(9)";
{
std::regex my_regex(R"(\w+ \d+, \d+\(\d+\))");
if (std::regex_search(str, my_regex)) {
std::cout << "Detected\n";
}
}
{
// With capture groups
std::regex my_regex(R"((\w+) (\d+), (\d+)(\(\d+\)))");
std::smatch match;
if (std::regex_search(str, match, my_regex)) {
std::cout << match[0] << std::endl;
}
}
}
追加の改善は、複数の間隔を処理することができをエスケープする必要がありますあなたの特別な場合は許可されます)。\s+
。
EJP's concernsがスポットオンである可能性があります。これは解析に非常に脆弱なソリューションです。
処理しているアセンブリ言語が標準言語であるという根本的な前提があります。それについての証拠はありますか?そうでない場合は、ジョブに間違ったツールを使用している可能性があります。 – EJP
これは半賢明なパーサー(IDEのハイライトのようなもの)でなければならない場合は、場所に '\ s +'や '\ s *ユーザーは、例えば 'lw 6、5(2)'のような何らかのスペースを入力することができます。 (しかしそれはまだちょうどハックイッシュの解決法ですが、完全なパーサはより良いでしょう) –
Ped7g