文字列内の数字のチェーンをキャプチャしたいのですが、最大3回までです。
その後の数字のチェーンは無視する必要があります。例えば:
T441_S45/1 => 441 45 1 007_S4 => 007 4 41_445T02_74 => 41 445 02
試しました(\d+){1,3}
が、うまくいかないようです...
ヒントはありますか?
任意の数の非数字と文字列の残りの部分で区切られた最初の3つの数字のチャンクを照合してキャプチャし、それらのグループへの後方参照に置き換えることができます。
^\D*(\d+)(?:\D+(\d+))?(?:\D+(\d+))?.*
または、文字列を複数行にすることができる場合は、
^\D*(\d+)(?:\D+(\d+))?(?:\D+(\d+))?[\s\S]*
置換文字列はのようになります$1 $2 $3
。
詳細
^
-文字列の開始\D*
-0以上の数字以外(\d+)
-グループ1:1桁以上(?:\D+(\d+))?
-オプションの非キャプチャグループマッチング:
\D+
-1桁以上の数字以外(\d+)
-グループ2:1桁以上 (?:\D+(\d+))?
-別のオプションの非キャプチャグループマッチング:
\D+
-1つ以上の数字以外(\d+)
-グループ3:1つ以上の数字 [\s\S]*
-文字列の残りの部分。
正規表現のデモを参照してください。
#include <iostream>
#include <regex>
using namespace std;
int main() {
std::vector<std::string> strings;
strings.push_back("T441_S45/1");
strings.push_back("007_S4");
strings.push_back("41_445T02_74");
std::regex reg(R"(^\D*(\d+)(?:\D+(\d+))?(?:\D+(\d+))?[\s\S]*)");
for (size_t k = 0; k < strings.size(); k++)
{
std::cout << "Input string: " << strings[k] << std::endl;
std::cout << "Replace result: "
<< std::regex_replace(strings[k], reg, "$1 $2 $3") << std::endl;
}
return 0;
}
出力:
Input string: T441_S45/1
Replace result: 441 45 1
Input string: 007_S4
Replace result: 007 4
Input string: 41_445T02_74
Replace result: 41 445 02
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加