0

次のテキスト行(METAタイトル)があります。

Buy [ProductName][Text] at a great price [/Text] from [ShopName] today.

私が持っている値に応じて交換しています。

必要に応じて機能していますが、置き換える正しい正規表現が見つかりません。

[Text] at a great price [/Text]

(角かっこで囲まれた)単語が変わるため、同じままになるのは次のとおりです。

[][/] 

つまり、私も交換したいかもしれません

[TestText]some test text[/TestText] with nothing.

私はこれを機能させています:

System.Text.RegularExpressions.Regex.Replace(SEOContent, @"\[Text].*?\[/Text]", @"");

私は次の正規表現を推定しました:

[.*?].*?\[/.*?]

動作しますが、動作しませんでした。-ASP.NET C#でコーディングしています。よろしくお願いします。

デイブ

4

1 に答える 1

1

名前付きキャプチャを使用して[..]のノード名を取得し、\k<..>を使用して再度検索します。

(\[(?<Tag>[^\]]+)\][^\[]+\[/\k<Tag>\])

IgnorePatternWhitespaceとサンプルプログラムを使用して分類しました。

string pattern = @"
(                # Begin our Match
  \[             # Look for the [ escape anchor
  (?<Tag>[^\]]+) # Place anything that is not antother ] into the named match Tag
  \]             # Anchor of ]
  [^\[]+         # Get all the text to the next anchor
  \[/            # Anchor of the closing [...] tag
  \k<Tag>        # Use the named capture subgroup Tag to balance it out
  \]             # Properly closed end tag/node.
)                # Match is done";

string text = "[TestText]some test text[/TestText] with nothing.";

Console.WriteLine (Regex.Replace(text, pattern, "Jabberwocky", RegexOptions.IgnorePatternWhitespace));
// Outputs
// Jabberwocky with nothing.

余談ですが、実際にトークン化正規表現を作成し(上記のパターンの正規表現を使用して)、名前付きキャプチャでセクションを識別することにより、一致内で置き換えます。次に、一致エバリュエーターを使用した置換で、次のような識別されたトークンを置換します。

string pattern = @"
(?(\[(?<Tag>[^\]]+)\][^\[]+\[/\k<Tag>\]) # If statement to  check []..[/] situation
  (                                      # Yes it is, match into named captures
   \[
   (?<Token>[^\]]+)                      # What is the text inside the [ ], into Token
   \]
   (?<TextOptional>[^\[]+)               # Optional text to reuse
   \[
   (?<Closing>/[^\]]+)                   # The closing tag info
   \]
  )
|                                        # Else, let is start a new check for either [] or plain text
 (?(\[)                                  # If a [ is found it is a token.
   (                                     # Yes process token
    \[
    (?<Token>[^\]]+)                     # What is the text inside the [ ], into Token
    \]
   )
  |                                      # Or (No of the second if) it is just plain text
  (?<Text>[^\[]+)                        # Put it into the text match capture.
 )
)
";


string text = @"Buy [ProductName] [Text]at a great price[/Text] from [ShopName] today.";

Console.WriteLine (
Regex.Replace(text,
              pattern,
              new MatchEvaluator((mtch) =>
              {

                 if (mtch.Groups["Text"].Success)           // If just text, return it.
                     return mtch.Groups["Text"].Value;

                 if (mtch.Groups["Closing"].Success)       // If a Closing match capture group reports success, then process
                 {
                    return string.Format("Reduced Beyond Comparison (Used to be {0})", mtch.Groups["TextOptional"].Value);
                 }

                  // Otherwise its just a plain old token, swap it out.
                  switch ( mtch.Groups["Token"].Value )
                  {
                     case "ProductName" : return "Jabberwocky"; break;
                     case "ShopName"    : return "StackOverFlowiZon"; break;
                  }


                  return "???"; // If we get to here...we have failed...need to determine why.

              }),
              RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture));
// Outputs:
// Buy Jabberwocky Reduced Beyond Comparison (Used to be at a great price) from StackOverFlowiZon today.
于 2013-02-06T19:56:34.623 に答える