Я ищу два регулярных выражения, которые дали строку, подобную следующей:

I want [I] cAptUre this [don't] number [want to] 9 and [be captured] this Word

  • (A) вернуть только строку внутри каждого [] (включая скобки). Я решил это с \[(.*?)\]

  • (B) вернуть все, кроме того, что находится внутри [] (скобки исключены из конечного результата). Так что противоположность предыдущему.

Ожидаемый результат:

  • (A) ["[I]", "[don't]", "[want to]", "[be captured]"]
  • (B) "I want CaptUre this number 9 and this Word"

Как я могу это сделать?

0
Leonardo Lurci 31 Май 2020 в 04:34

3 ответа

Лучший ответ

Я немного изменил исходную строку, чтобы включить крайние случаи:

[We] I want [I] cAptUre this [don't] number [want to] 9 and [be captured] this Word [89]

var without_brackets = Regex.Replace(s, @"\s*\[.*?\]\s*", " ").Trim();
var in_brackets = string.Join(" ", Regex.Matches(s, @"\[(.*?)\]")
                        .OfType<Match>()
                        .Select(m => m.Groups[1].Value));

WriteLine($"Without brackets: '{without_brackets}'");
WriteLine($"In brackets: '{in_brackets}'");

// Output:
// Without brackets: 'I want cAptUre this number 9 and this Word'
// In brackets:      'We I don't want to be captured 89'

Без скобок

Шаблон ищет в скобках и все пробелы с обеих сторон и заменяет их пробелом. Я использовал * квантификатор для \s, чтобы включить крайние случаи, когда в скобках могут быть слова в конце и в начале строки. Кроме того, Trim требуется для удаления лишних пробелов для краевых случаев.

С кронштейнами

Все просто - ищите что-нибудь в скобках и Join их.

1
Community 20 Июн 2020 в 09:12

Что касается (A), вы можете использовать Match.Group и шаблон @"(\[[^]]+\])", предложенный Жилем Квено. Что касается (B), вы можете использовать Regex.Replace, чтобы заменить текстовые скобки:

var input = "I want[I]  cAptUre this[don't] number [want to] 9 and [be captured] this Word";
var pattern = @"(\[[^]]+\])";

var result = Regex.Replace(input, pattern, "");
Console.WriteLine(result);

Выход

I want  cAptUre this number  9 and  this Word

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

result = Regex.Replace(result, @"(\s\s+)", " ");
1
JimiLoe 31 Май 2020 в 10:21

Вот так для первого требования:

(\[[^]]+\])

Проверьте https://regex101.com/r/NdmSRF/1

Что касается второго требования, не обязательно, чтобы это выполнялось одним только регулярным выражением, но может это сделать:

$ sed -E 's/\[[^]]+\]//g' file
I want   cAptUre this  number  9 and  this Word
0
Gilles Quenot 31 Май 2020 в 01:45