C # Regex удалить строку - PullRequest
0 голосов
/ 11 марта 2011

Мне нужно применить регулярное выражение в C #.Строка выглядит следующим образом:

MSH|^~\&|OAZIS||C2M||20110310222404||ADT^A08|00226682|P|2.3||||||ASCII
EVN|A08
PD1
PV1|1|test

И что я хочу сделать, это удалить все строки, которые содержат только 3 символа (без разделителей '|').Таким образом, в этом случае строка 'PD1' (3-я строка) должна быть удалена.Возможно ли это с помощью регулярного выражения?

Thx

Ответы [ 10 ]

1 голос
/ 11 марта 2011

Это: (?<![|])[^\n]{4}\n Regex соответствует тому, что вы хотели в онлайн-тестере regex, который я использовал, однако я считаю, что {4} на самом деле должен быть {3}, поэтому попробуйте переключить их, если он не работает для вас.

РЕДАКТИРОВАТЬ:

Это также работает: \n[^|\n]{3}\n и, вероятно, ближе к тому, что вы ищете.

РЕДАКТИРОВАТЬ 2:

Число в скобках определенно {3}, проверено дома.

1 голос
/ 11 марта 2011

Следующее будет делать то, что вы хотите без регулярных выражений.

String inputString;
String resultingString = "";
for(var line in inputString.Split(new String[]{"\n"})) {
    if (line.Trim().Length > 3 || line.Contains("|"))
        resultingString += line + "\n";
}

Это предполагает, что у вас есть файл в виде одной большой строки. И это дает вам еще одну строку с удалением необходимых строк.

(Или вы можете сделать это непосредственно с файлом:

string[] goodLines = 
    // read all of the lines of the file
    File.ReadLines("fileLocation").
        // filter out the ones you want
        Where(line => line.Trim().Length > 3 || line.Contains("|")).ToArray();

В результате вы получите строку [] со всеми правильными строками в вашем файле.)

0 голосов
/ 22 мая 2016

Вы можете сделать это, используя Regex

string output = Regex.Replace(input, "^[a-zA-Z0-9]{3}$", "");

[a-zA-Z0-9] будет соответствовать любому символу или число {3} будет соответствовать точному числу 3

0 голосов
/ 16 марта 2012

попробуйте это:

text = System.Text.RegularExpressions.Regex.Replace(
        text, 
        @"^[^|]{3}(?:\r\n|[\r\n]|$)", 
        "", 
        System.Text.RegularExpressions.RegexOptions.Multiline);
0 голосов
/ 11 марта 2011

Вопрос немного расплывчатый.

Как уже говорилось, ответ примерно такой:

(?:^|(?<=\n))[^\n|]{3}(?:\n|$), который допускает пробелы в матче.
Так что "#\t)" такжебыть удаленным.

Чтобы ограничить символы до визуального (без пробелов), вы можете использовать
(?:^|(?<=\n))[^\s|]{3}(?:\n|$)
, который до сих пор допускает пробелы.

Для обоих контекст являетсяодна строка, замена '' и глобальная.
Пример контекста в perl: s/(?:^|(?<=\n))[^\n|]{3}(?:\n|$)//g

0 голосов
/ 11 марта 2011

Просто общее замечание по решениям, которые я видел опубликованными до сих пор. Оригинальный вопрос включал комментарий «удалить все строки, которые только содержат 3 символа» [мой акцент]. Я не уверен, что вы имели в виду буквально «только 3 символа», но если вы это сделали, вы можете изменить логику предлагаемых решений с такими вещами, как

   if (line.Trim().Length > 3 ...)

до

   if (line.Trim().Length != 3 ...)

... на всякий случай строки с 2 символами действительно допустимы, например. (Та же идея для предложенных решений регулярных выражений.)

0 голосов
/ 11 марта 2011

^ - начало строки.\ w - символ слова {3} - представлен ровно 3 раза $ - конец строки

^\w{3}$
0 голосов
/ 11 марта 2011

Всегда ли три персонажа будут на одной линии?Если это так, вы можете использовать начало строки / конец строковых маркеров.

Вот регулярное выражение, которое соответствует трем символам, которые сами по себе находятся в строке:

\A.{3}\z

\ A - началостроки.\ z - конец строки.,любой символ, {3} с 3 вхождениями

0 голосов
/ 11 марта 2011

Это регулярное выражение будет идентифицировать строки, которые соответствуют вашим критериям исключения ^[^|]{3}$, тогда это просто вопрос итерации по всем строкам (с данными) и проверки, какие из них соответствуют критериям исключения.Например, вот так.

foreach(Match match in Regex.Matches(data, @"^.+$")
{
  if (!Regex.IsMatch(match.Value, @"^[^|]{3}$"))
  {
     // Do Something with legitamate match.value like write line to target file.
  }
}
0 голосов
/ 11 марта 2011

почему бы просто не получить дескриптор файла, создать временный выходной файл и выполнить строки по очереди. Если есть строка с 3 символами, просто пропустите ее. Если файл может храниться в памяти целиком, то, возможно, используйте GetLines () (я думаю, именно так называется метод), чтобы получить массив строк, представляющий файл строка за строкой.

...