Регулярное выражение для замены квадратных скобок угловыми скобками - PullRequest
0 голосов
/ 28 ноября 2009

У меня есть строка вроде:

[a b="c" d="e"]Some multi line text[/a]

Теперь часть d="e" является необязательной. Я хочу преобразовать такой тип строки в:

<a b="c" d="e">Some multi line text</a>

Значения a b и d являются постоянными, поэтому мне не нужно их ловить. Мне просто нужны значения c, e и text between the tags и создание эквивалентного выражения на основе xml. Так как это сделать, потому что есть некоторая дополнительная часть.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2009

Будет ли some multiline text включать [ и ]? Если нет, вы можете просто заменить [ на < и ] на >, используя string.replace - без необходимости в регулярных выражениях.

Обновление: Если это может быть что угодно, кроме [/a], вы можете заменить

^\[a([^\]]+)](.*?)\[/a]$

с

<a$1>$2</a>

Я не избежал ] и / в регулярном выражении - избегайте их при необходимости, чтобы получить

^\[a([^\]]+)\](.*?)\[\/a\]$
0 голосов
/ 28 ноября 2009

Для тегов HTML, пожалуйста, используйте анализатор HTML.

Для [a] [/ a] вы можете сделать следующее

Match m=Regex.Match(@"[a b=""c"" d=""e""]Some multi line text[/a]", 
                    @"\[a b=""([^""]+)"" d=""([^""]+)""\](.*?)\[/a\]",
                    RegexOptions.Multiline);

m.Groups[1].Value
"c"
m.Groups[2].Value
"e"
m.Groups[3].Value
"Some multi line text"

Вот Regex.Replace (хотя я не так предпочитаю)

string inputStr = @"[a b=""[[[[c]]]]"" d=""e[]""]Some multi line text[/a]";
string resultStr=Regex.Replace(inputStr,
                            @"\[a( b=""[^""]+"")( d=""[^""]+"")?\](.*?)\[/a\]",
                            @"<a$1$2>$3</a>", 
                            RegexOptions.Multiline);
0 голосов
/ 28 ноября 2009

Если вы на самом деле думаете об обработке (псевдо) -HTML с использованием регулярных выражений,

не

SO заполнен сообщениями, в которых предлагаются регулярные выражения для HTML / XML, и ответами, указывающими, почему это плохая идея.

Предположим, что ваш многострочный текст ("который может быть чем угодно") содержит

[a b="foo" [a b="bar"]]

регулярное выражение не может обнаружить это.

См. Классический ответ в: RegEx соответствует открытым тегам, за исключением автономных тегов XHTML

который имеет:

Думаю, мне пора бросить пост помощника Не разбирайте HTML С сотрудником Regex. Независимо от того, сколько раз мы говорим это, они не остановятся приходить каждый день ... даже каждый час. Это безнадежное дело, которое кто-то еще могу немного побороться. Так что давай, разбирайся HTML с регулярным выражением, если нужно. Это только сломанный код, а не жизнь и смерть. - бобинц

Серьезно. Найдите XML или HTML DOM и заполните его своими данными. Тогда сериализуйте это. Это позаботится обо всех проблемах, о которых вы даже не подозревали.

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