Регулярное выражение, чтобы удалить даже линии - PullRequest
1 голос
/ 12 февраля 2010

Мне нужна помощь для создания регулярного выражения, которое может удалить даже строки в простом текстовом файле

С учетом этого ввода:

line1
line2
line3
строка4
line5
line6

Это выведет это:

line1
line3
line5

Спасибо!

Ответы [ 5 ]

7 голосов
/ 12 февраля 2010

На самом деле, вы не используете регулярные выражения для этого. С вашим любимым языком, итерации файла, использовать счетчик и сделать модуль. например с awk (* nix)

$ awk 'NR%2==1' file
line1
line3
line5

четные строки:

$ awk 'NR%2==0' file
line2
line4
line6
2 голосов
/ 12 февраля 2010

Во-первых, я полностью согласен с мнением, что это не что-то, что должно делать регулярное выражение.

Вот демонстрационная версия Java:

public class Test {

    public static String voodoo(String lines) {
        return lines.replaceAll("\\G(.*\r?\n).*(?:\r?\n|$)", "$1");
    }

    public static void main(String[] args) {
        System.out.println("a)\n"+voodoo("1\n2\n3\n4\n5\n6"));
        System.out.println("b)\n"+voodoo("1\r\n2\n3\r\n4\n5\n6\n7"));
        System.out.println("c)\n"+voodoo("1"));
    }
}

output:

a)
1
3
5

b)
1
3
5
7

c)
1

Краткое объяснение регулярного выражения:

\G       # match the end of the previous match
(        # start capture group 1
  .*     #   match any character except line breaks and repeat it zero or more times
  \r?    #   match the character '\r' and match it once or none at all
  \n     #   match the character '\n'
)        # end capture group 1
.*       # match any character except line breaks and repeat it zero or more times
(?:      # start non-capture group 1 
  \r?    #   match the character '\r' and match it once or none at all
  \n     #   match the character '\n'
  |      #   OR
  $      #   match the end of the input
)        # end non-capture group 1

\G начинается в начале строки.Каждая пара строк (где вторая строка необязательна, в случае последней неровной строки) заменяется первой строкой в ​​паре.

Но опять же: с использованием обычного языка программирования (если можно вызвать awk "нормальный" :)) это путь.

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

И, как предположил Тим, это также работает:

replaceAll("(?m)^(.*)\r?\n.*", "$1")
1 голос
/ 12 февраля 2010

Хорошо, если вы выполните поиск и замену всех совпадений на

^(.*)\r?\n.*

в "^ соответствует режиму начала строки" и ". не соответствует режиму перевода строки"; замена на

\1

тогда вы теряете каждую четную линию.

Е. г. в C #:

resultString = Regex.Replace(subjectString, @"^(.*)\r?\n.*", "$1", RegexOptions.Multiline);

или в Python:

result = re.sub(r"(?m)^(.*)\r?\n.*", r"\1", subject)
0 голосов
/ 12 февраля 2010

Возможно, вы находитесь в командной строке. В PowerShell:

$x = 0; gc .\foo.txt | ? { $x++;  $x % 2 -eq 0 }
0 голосов
/ 12 февраля 2010

Что ж, это удалит ДАЖЕ строки из текстового файла:

grep '[13579]$' textfile > textfilewithoddlines

И выведите это:

line1

line3

line5

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