Как мне обрезать пробелы? - PullRequest
3 голосов
/ 05 апреля 2019

У меня есть строка с пробелами в начале и в конце. Например:

<para> This is a test paragraph </para>

Теперь у меня есть регулярное выражение "(<\\w+[^<>\\/]*> | <\\/\\w+>)", которое находит любые начальные и конечные пробелы между > и <.

Итак, если я найду пробелы в начале, конце или, может быть, в обоих, я хочу обрезать их.

Как мне это сделать?

Я думал о:

string mainstring = "<para> This is a test paragraph </para>";
string regex1 = "(<\\w+[^<>\\/]*> | <\\/\\w+>)";
string regex2 = "(<\\w+[^<>\\/]*>|<\\/\\w+>)";
mainstring = Regex.replace(mainstring, regex1, regex2);

Но это не сработает.

Кроме того, моя строка содержит несколько строк.

string mainstring = "<para> This is a test paragraph </para>";
string regex1 = "(<\\w+[^<>\\/]*> | <\\/\\w+>)";
mainstring = Regex.replace(mainstring, regex1, "");

Но это удаляет все найденные значения и заменяет его на "".

Основной вход: "<para> This is a test paragraph </para>"
Ожидаемый результат: "<para>This is a test paragraph</para>"

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

Я думаю, что самым простым подходом было бы извлечь текст между тегами и затем использовать метод Trim() для этого текста:

  var mainstring = "<para> This is a test paragraph </para>";
  // First index of >
  var start = mainstring.IndexOf(">") + 1;
  var prefix = mainstring.Substring(0, start);
  // Last index of <
  var end = mainstring.LastIndexOf("<") - 1;
  var suffix = mainstring.Substring(end + 1);
  mainstring = prefix + mainstring.Substring(start, end - start + 1).Trim() + suffix;

Нет необходимости использовать регулярные выражения

1 голос
/ 05 апреля 2019

Используйте группы захвата вокруг частей, которые вы хотите сохранить (чтобы заменить их обратными ссылками в шаблоне замены) и \s+ для удаления пробелов:

string mainstring = "<para> This is a test paragraph </para>";
string regex1 = @"(<\w+[^<>/]*>)\s+|\s+(</\w+>)";
mainstring = Regex.Replace(mainstring, regex1, "$1$2");
Console.WriteLine(mainstring);

См. Демонстрационную версию C # .

Детали

  • (<\w+[^<>/]*>)\s+ - Группа 1 ($1): <, 1+ слов с символами, 0 или более символов, отличных от <, >, / (обратите внимание, вам не нужно бежать / в регулярном выражении .NET), затем >, а затем 1+ пробелов, которые находятся вне группы
  • | - или
  • \s+ - 1+ пробелов
  • (</\w+>) - Группа 2 ($2): </, 1+ слов и a >.

Вот демоверсия .NET :

enter image description here

1 голос
/ 05 апреля 2019

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

(<(\w+)>)\s*(.*?)\s*(<\/\2>)

И замените все на \1\3\4, что избавит от ненужных пробелов и сохранит все остальное.

Вы можете расширить набор символов тегов, если вам не достаточно \w и вы можете использовать что-то вроде [\w.-] и т. Д.

Демо

Проверьте эти C # коды для демонстрации ,

string pattern = @"(<(\w+)>)\s*(.*?)\s*(</\2>)";
string substitution = "$1$3$4";
string input = "<para> This is a test paragraph </para>";
Console.WriteLine("Before: " + input);
Regex regex = new Regex(pattern);
string result = regex.Replace(input, substitution);
Console.WriteLine("After: " + result);

печать

Before: <para> This is a test paragraph </para>
After: <para>This is a test paragraph</para>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...