あなたは先読みとの一致に失敗。あなたがtempered greedy token必要があります。
(?s)StartTest(?:(?!(?:Start|End)Test|NoInclude).)*EndTest
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
は正規表現がに一致さregex demo
を参照してください、そしてEndTest
まで、、EndTest
かNoInclude
ではない任意のテキストと一致します。
*
は貪欲であるため、.
は可能な限り一致します。 またはEndTest
NoInclude
- - ちょうどNoInclude
(?:Start|End)Test
:否定先読みは、それが次の選択肢で続いている場所でのマッチングを停止いたします。
注:(?s)
インライン改質剤(RegexOptions.Singleline
フラグに相当)であり、それはあまりにも、LF(改行)と一致行うパターンで.
挙動を修正します。この修飾子がなければ(またはRegexOptions.Singleline
なし)、ドットは改行以外の文字に一致します。
NOTE2:ネイティブコード環境外の正規表現をテストする場合は、正規表現のフレーバに適切なテスターを使用していることを確認してください。 regexr.comはJavaScriptのフレーバーのみをサポートし、regex101.comはJS、PCREとPythonのフレーバーをサポートし、RegexStorm.net/RegexHero.netは.NETのフレーバーをサポートします。もっと多くのテスターがいて、彼らが何をサポートしているのか、何が最初でないのかを読んでください。ここで
はC# demoです:
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Linq;
public class Test
{
public static void Main()
{
var input = "StartTest\n NoInclude\nEndTest\n\nStartTest\n Include\nEndTest";
var regex = new Regex(@"(?s)StartTest(?:(?!(?:Start|End)Test|NoInclude).)*EndTest");
var results = regex.Matches(input).Cast<Match>()
.Select(p => p.Value)
.ToList();
Console.WriteLine(string.Join("\n", results));
}
}
、Wiktor第ありがとうございました。正規表現が頭痛のどれくらいを私に与えるかはあなたには分かりません。私は何百ものチュートリアルに時間を費やしてしまったので、私はそれの周りに頭を包むことができません。構文はとても気が散っているので、私は実際にそれに慣れるのに数週間それを毎日使う必要があるような気がします。 – John
まあ、実際には、正規表現なしで、あるいは単純な '(?s)StartTest。*?EndText' regexを使ってすべてを行い、' NoInclude'を含んでいないものだけを得ることができます。強化された貪欲なトークンは少し高価ですが、.NET正規表現エンジンは本当に効率的です。 –
さて、私はあなたがこれを数回編集したのを見ました。私は単純なものから私が理解していないものへ、再び笑いました。 "(?:(?!(?:" Start OR Endは簡単ですが、そこから迷子になりました...)OPにもっと追加するつもりでしたが、できないようです。 – John