Как сопоставить строку, содержащую много \ r \ n \ f, используя регулярные выражения? - PullRequest
0 голосов
/ 28 октября 2009

Я хочу перехватить слово «назначение» только в том случае, если оно найдено в начале строки, а строка заканчивается после этого слова. После слова «назначение» может быть ноль или более пробелов и такие символы, как: или # или - might пришел.

Например, следующие строки должны соответствовать

Assignments

или

Assignments :

или

assignments                

Где как, следующая строка не должна совпадать

The details of various assignments that I have ...

Я получаю следующую строку из одного файла, который содержит два вхождения слова «назначение».

Ab Initio\r\r\a\r\a\v\r\r\fAssignments\rThe details of the various assignments that I 

Я написал следующее регулярное выражение, но оно ничего не может захватить:

^Assignments(\s|:|-|#)*?$

Когда я пишу регулярное выражение, как показано ниже, оба случая «назначения» выбираются:

Assignments(\s|:|-|#)*?($)?

Есть догадки? Что я должен делать? Я использую C # для этого.

Мой код C # выглядит следующим образом:

RegEx  x = new Regex(@"^Assignments(\s|:|-|#)*?$", RegexOptions.IgnoreCase | RegexOptions.Multiline);

output = x.Replace(inputText, "@@@@@@@@@@@@@@@@\r\n<project_details>$&");
            if (x.IsMatch(inputText))
            {
                Match m = x.Match(inputText);

                Console.WriteLine("\n\n\t~~~~~~~~~~   match found ~~~~~~~~~~~");
                Console.WriteLine(m.Index +" : " + m.Value);
                Console.WriteLine("\n\n\n\n" + output);                
            }
            else
            {
                Console.WriteLine("$$$$$$$$$$$$$ no match  %%%%%%%%%%%%%%");
            }

Только что я проверил мою строку ввода. Исходные строки в файле выглядят следующим образом:

Assignments
The details of various assignmenths that I ...

Но когда я загружаю файловый поток в одну строковую переменную, Я получаю такую ​​же строку, как это:

\r\r\a\r\a\v\r\r\fAssignments\rThe details of the various assignments that I

Кто-нибудь знает, что происходит? Как мне сформулировать свое регулярное выражение? Пожалуйста, помогите !!!!

Ответы [ 3 ]

1 голос
/ 28 октября 2009

Первое решение работает, если вы используете регистр без учета регистра и многострочный:

Regex RegexObj = new Regex("^Assignments(\\s|:|-|#)*?$",
        RegexOptions.IgnoreCase | RegexOptions.Multiline);
1 голос
/ 28 октября 2009

Я собираюсь пойти дальше и предположить, что вам действительно не нужен этот символ подачи формы (\ f), и если нет, то это сработает:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ScratchConsole
{
    class Program
    {
        private static string[] punctuationChars = new string[] 
        {
            ":",
            ";"
        };
        static void Main(string[] args)
        {
            string foo = "Ab Initio\r\r\a\r\a\v\r\rAssignments\rThe details of the various assignments that I";
            string[] split = foo.Split(new string[] { "\r" },StringSplitOptions.None);
            foreach (string s in split)
            {
                if (s.StartsWith("Assignments"))
                {
                    string temp = s.Remove(0, "Assignments".Length );
                    foreach (string c in punctuationChars)
                    {
                        temp = temp.Replace(c, "");
                    }
                    if (string.IsNullOrEmpty(temp.Trim()))
                    {
                        Console.WriteLine("it worked!");
                    }
                }
            }
            Console.Read();
        }
    }
}

Насколько я помню, есть цитата, которая звучит примерно так: «Иногда у кого-то возникает проблема, и они решают использовать регулярные выражения. Теперь у них две проблемы». (Не фактическая цитата, но достаточно хорошая :))

1 голос
/ 28 октября 2009

Используйте RegexOptions.Multiline со своим регулярным выражением, это изменит значение ^ и $ для соответствия начала / конца строки соответственно (вместо совпадения с началом / концом всей строки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...