Regex على specifig الكلمات ومحتواها ، groupped قبل اسم الوسم

StackOverflow https://stackoverflow.com/questions/200525

  •  03-07-2019
  •  | 
  •  

سؤال

هنا هو الإدخال (html, لا xml):

... html content ...
<tag1> content for tag 1 </tag1>
<tag2> content for tag 2 </tag2>
<tag3> content for tag 3 </tag3>
... html content ...

أود الحصول على 3 مباريات ، مع كل مجموعتين.المجموعة الأولى تحتوي على اسم العلامة المجموعة الثانية تحتوي على النص الداخلية من الوسم.هناك فقط تلك العلامات الثلاث ، لذلك لا تحتاج إلى أن تكون عالمية.

وبعبارة أخرى:

match.Groups["name"] would be "tag1"
match.Groups["value"] would be "content for tag 2"

أي أفكار ؟

هل كانت مفيدة؟

المحلول

وأنا لا أرى لماذا كنت تريد استخدام أسماء المجموعات مباراة لذلك.

وهنا هو تعبير عادي من شأنه أن تطابق اسم العلامة ومحتوى العلامة في المباريات الفرعية مرقمة.

<(tag1|tag2|tag3)>(.*?)</$1>

وهنا هو البديل مع أسماء مجموعة النمط. NET

<(?'name'tag1|tag2|tag3)>(?'value'.*?)</\k'name'>.

وتحرير

وتكييفها باستخدام التعابير المنطقية وفقا لتوضيح المؤلف مسألة ل.

نصائح أخرى

Regex هذا قد يكون:

/<([^>]+)>([^<]+)<\/\1>/

ولكن هذا العام أنا لا أعرف الكثير عن الهروب مشنيسم من .صافي.ترجمة:

  • الأولى من مباريات المجموعة الأولى الوسم اسم بين < و >
  • الثانية من مباريات المجموعة محتويات (من > التالي <
  • النهاية تحقق إذا كان أول الوسم مغلق

HTH

وشكر جميع ولكن أيا من العمل regexes. :( ربما لم أكن محددة بما فيه الكفاية، آسف لذلك هنا هو أتش تي أم أل المحدد أحاول تحليل:.

...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...

وآمل أن يكون أكثر وضوحا الآن. أنا بعد علامات USER وMESSAGE.

ولست بحاجة للحصول مباراتين، مع اثنين من كل مجموعة. wpould المجموعة الأولى تعطيني اسم العلامة (المستخدم أو رسالة) وستكون المجموعة الثانية تعطيني النص الداخلي بأكمله من العلامة.

هل أكس البيانات السليم، أو أنها لا تبدو وكأنها مجرد ذلك؟

وإذا كان أتش تي أم أل، ثم HTML أجيليتي حزمة عبارة التحقيق يستحق - وهذا يوفر DOM ( على غرار XmlDocument) التي يمكنك استخدامها للاستعلام عن بيانات:

string input = @"<html>...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...</html>";

            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(input);
            foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//user | //message"))
            {
                Console.WriteLine("{0}: {1}", node.Name, node.InnerText);
                // or node.InnerHtml to keep the formatting within the content
            }

وهذه النواتج:

user:  hello mitch
message:  some html message bla

إذا كنت تريد علامات التنسيق، ثم استخدم .InnerHtml بدلا من .InnerText.

وإذا كان أكس، ثم إلى رمز مع مجموعة كاملة من أكس، سيكون من الأفضل استخدام محلل XML. للالصغيرة إلى متوسطة الحجم أكس، فإن تحميلها إلى DOM مثل XmlDocument يكون على ما يرام - ثم الاستعلام العقد (على سبيل المثال، "// *"). لأكس ضخمة، قد يكون XmlReader خيارا.

إذا لم يكن لديك بيانات للقلق حول أكس كامل، ثم بعض التعابير المنطقية بسيط لا ينبغي أن تكون صعبة جدا ... مثال مبسط (بدون سمات، لا مساحات، لا أكس المتداخلة) قد تكون:

string input = @"blah <tag1> content for tag 1 </tag1> blop
<tag2> content for tag 2 </tag2> bloop
<tag3> content for tag 3 </tag3> blip";

        const string pattern = @"<(\w+)>\s*([^<>]*)\s*</(\1)>";
        Console.WriteLine(Regex.IsMatch(input, pattern));
        foreach(Match match in Regex.Matches(input, pattern)) {
            Console.WriteLine("{0}: {1}", match.Groups[1], match.Groups[2]);
        }

وكانت المشكلة أن ([^ <] *) الناس يستخدمون لتتناسب مع الأشياء داخل العلامات كانت مطابقة فتح <العلامات المتداخلة، ومن ثم وسم الإغلاق للعلامة المتداخلة لم تطابق العلامة الخارجي وهكذا فشلت التعبير المعتاد.

وهنا هو نسخة قليلا أكثر قوة من التعابير المنطقية Tomalak الذي يسمح للسمات وبيضاء:

Regex tagRegex = new Regex(@"<\s*(?<tag>" + string.Join("|", tags) + @")[^>]*>(?<content>.*?)<\s*/\s*\k<tag>\s*>", RegexOptions.IgnoreCase);

من الواضح إذا كنت لن يؤدي الا من أي وقت مضى في حاجة إلى استخدام مجموعة معينة من العلامات التي يمكن أن تحل محل

string.Joing("|", tags)

ومع أنبوب ضمني قائمة العلامات فصلت.

والقيود من التعبير المعتاد هي أنه إذا كان لديك علامة واحدة تحاول تطابق متداخلة داخل آخر وسوف تتناسب فقط علامة الخارجي. أي بمعنى.

<اقتباس فقرة>   

<المستخدم> حروف <رسالة> مواطنه غي

ووسوف تطابق العلامة المستخدم الخارجي، ولكن ليس علامة رسالة الداخلية.

وكما لا يعالج> الصورة نقلت في سمات مثل ذلك:

<اقتباس فقرة>   

ووسوف تتطابق فقط

<اقتباس فقرة>   

وسيكون جزء من محتوى العلامات.

وهذا سوف اعطيكم مجموعة التقاط اسمه لما تريد. انها لن تعمل لعلامات متداخلة، ولكن.

و /<(?<name>[^>]+)>(?<value>[^<]+)</\1>/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top