1

boost::regex で正規表現を置き換えようとしましたが、うまくいかないようです。

正規表現は次のとおりです。

(\\w+,\\d+,\\d+,\\d+\tscript\t)(.+)(#)(.+)(\t\\d+(,\\d+)?(,\\d+)?,{)

そしてフォーマッタ:

$1\"$2\"$3\"$4\"$5

コード: (getInput() は、一致する必要があるコンテンツを含む文字列を返します)

std::string &Preprocessor::preprocess()
{
    std::string &tempString = getInput();
    boost::regex scriptRegexFullName;
    const char *scriptRegexFullNameReplace = "$1\"$2\"$3\"$4\"$5";

    scriptRegexFullName.assign("(\\w+,\\d+,\\d+,\\d+\tscript\t)(.+)(#)(.+)(\t\\d+(,\\d+)?(,\\d+)?,{)");

    tempString = boost::regex_replace(tempString, scriptRegexFullName, scriptRegexFullNameReplace, boost::match_default);

    return tempString;
}

このWebサイトに次のテストケースを配置すると:

alberta,246,82,3    script  Marinheiro#bra2 100,{
brasilis,316,57,3   script  Marinheiro#bra1 100,{
brasilis,155,165,3  script  Orientação divina#bra1  858,{

ウェブサイトの出力は正しいです:

alberta,246,82,3    script  "Marinheiro"#"bra2" 100,{
brasilis,316,57,3   script  "Marinheiro"#"bra1" 100,{
brasilis,155,165,3  script  "Orientação divina"#"bra1"  858,{

しかし、boost::regex を使用すると、出力は次のようになります。

alberta,246,82,3    script  "Marinheiro#bra2    100,{
brasilis,316,57,3   script  Marinheiro#bra1 100,{
brasilis,155,165,3  script  Orientação divina#bra1  858,{

私は何を間違っていますか、誰でも知っていますか?

助けてくれてありがとう。

4

1 に答える 1

2

問題(.+)は、貪欲で、おそらく#主題の文字列の最後まで、彼ができるすべてをつかむあなたの最初のものから来ています.

このパターンで試すことができます:

const char *scriptRegexFullNameReplace = "$1\"$2\"#\"$3\"$4";

scriptRegexFullName.assign("(\\p{L}+,\\d+,\\d+,\\d+\\s+script\\s+)([^#]+)#(\\S+)(\\s+\\d+,\\{)");

注意事項:

  • 中かっこのエスケープはおそらく必要ないので、削除してみてください。
  • p{L}[^,]Unicode文字を表しますが、問題がある場合は置き換えてみてください
  • +より多くのパフォーマンスのためにすべてを置き換えることができ++ます(バックトラックは許可されていません)
  • それ自体を交換するためにシャープをキャプチャする必要はありません。これが、パターンにキャプチャ グループが 4 つしかない理由です。
  • (怠惰な量指定子のドット)を使用する代わりに、(.+?)文字クラスを減らした貪欲な量指定子を使用する方がパフォーマンスが向上します。これにより[^#]、最初の文字まですべての文字が一致します。#
于 2013-08-11T02:36:55.163 に答える