2016-01-04 4 views
1

Я новичок в использовании XML и не имел большой подготовки. Я пытаюсь правильно форматировать текст в пользовательском отчете. У меня есть эта строка:Regexp заменить в XML

.replace(/(<([^>]+)>)/ig, "\n") 

и хотел бы полностью понять, что он делает. Я знаю, что новая строка заменяет то, что находится в круглых скобках. В частности, что это ищет?

([^>]+)>) 

Редактировать (с комментариями):

Вот полное выражение (переформатировать для удобства чтения).

<expression name="expression" type="javascript"> 
    (
    dataSetRow["Question_Employee_Comment"] + 
    dataSetRow["Question_‌​Manager_Comment"] 
) 
    .replace(/(&lt;([^>]+)>)/ig, "\n") 
    .replace(/null/ig, "") 
    .replace(/&amp;amp;/g, "&amp;") 
    .replace(/&amp;#39;/g,"'") 
    .replace(/&amp;nbsp;/g," ") 
    .replace(/•/g,'\n•') 
</expression> 

И вот XML, что это выражение смотрит на (оболочку для удобства чтения):

<wd:Question_Employee_Comment> 
    &lt;p>I don't even know where to start... Cupid wasn't @ his desk on 2/14/2015 
    and I'm really upset because I've been really patient with his personal needs. 
    Santa &amp;amp; I sat him down and have discussed why his attendance is important 
    to success.&lt;/p>&lt;p>&lt;/p>&lt;p>He's been absent 
    on:&lt;/p>&lt;ul>&lt;li>3/19/15&lt;/li>&lt;li>March 20, 
    2015&lt;/li>&lt;li>05/01/2015&lt;/li>/ul>&lt;p>&lt;/p>&lt;p>All 
    additional dates will be documented.&lt;/p> 
</wd:Question_Employee_Comment> 
+0

https://regex101.com/r/uB1lQ8/1 – choroba

+0

прав .Надеть (/ (< ([^>] +)>)/И.Г., "\ п")? не будет .replace (/ (<([^>] +)>)/ig, "\ n")? – Polak

ответ

1

Это регулярное выражение (или регулярное выражение) можно разбить следующим образом.

(&lt;([^>]+)>) 

Скобки для группировки.

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

Иногда они используются, чтобы разрешить несколько альтернативных вариантов (например (a|b|c), но я не вижу, что здесь либо.

Поскольку скобки ничего не делают в этом выражении, по крайней мере, не так далеко, как соответствия , давайте игнорировать их, что оставляет это:..

&lt;[^>]+> 

Половина этого просто прописные буквы, чтобы соответствовать начало матча должно быть символьная строка 4 символов &lt;, и конец строки является буквальным символ >. В середине это единственный бит регулярного выражения.

[^>]+ 

квадратные скобки обозначают класс символов. Внутри класса символов, если ^ является первым символом, как он есть здесь, то это обратный символ класса , то есть означает «соответствовать вещам , а не эти вещи». Итак, этот класс символов говорит, что «соответствует вещам, которые не являются >».

+ после класса символа называется квантором , а это означает «одна или несколько из этой штуки».

Итак, в совокупности это означает «одна или несколько вещей, которые не являются >».

Полное выражение означает: соответствие &lt;, за которым следует одна или несколько вещей, которые не являются >, а затем >.

После выражения два флага, i и g. Значение i означает совпадение с регистром без учета регистра. Здесь ничего не происходит, потому что у вашего выражения нет совпадающих символов, которые являются алфавитными. Флаг g означает совпадение по всему миру, то есть, если имеется более одного совпадения с входом, они соответствуют всем, а не соответствуют только в первом случае.

Теперь, глядя на ваш пример XML, я считаю, что выражение произведет ряд изменений. Обратите внимание, что вы разместили только контент <wd:Question_Employee_Comment>, но выражение фактически работает как с этим, так и с содержимым <wd:Question_Manager_Comment>, если оно имеет значение. Я не буду отмечать здесь <wd:Question_Manager_Comment>, потому что вы не опубликовали его содержимое.

  1. Ведущее &lt;p> непосредственно перед I don't even будет заменена новой строки.
  2. Сразу после important to success, &lt;/p>&lt;p>&lt;/p>&lt;p> будет заменен на 4 строки новой строки.
  3. Сразу после absent on, &lt;/p>&lt;ul>&lt;li> будет заменен на 3 строки новой строки.
  4. Сразу после 3/19/15, &lt;/li>&lt;li> будет заменен на две новые строки.
  5. Сразу после March 20, 2015, &lt;/li>&lt;li> будет заменен на две строки новой строки.
  6. Сразу после 5/01/2015, &lt;/li> будет заменен новой строкой.
  7. Незадолго до All additional, `< p> </p> < p> будет заменен тремя новыми строками.
  8. В конце &lt;/p> будет заменен на новую строку.

Обратите внимание, что там есть частичный тег, который пропущен выражением /ul>.

Результат:

<wd:Question_Employee_Comment> 
    \nI don't even know where to start... Cupid wasn't @ his desk on 2/14/2015 
    and I'm really upset because I've been really patient with his personal needs. 
    Santa &amp;amp; I sat him down and have discussed why his attendance is important 
    to success.\n\n\n\nHe's been absent 
    on:\n\n\n3/19/15\n\nMarch 20, 
    2015\n\n05/01/2015\n/ul>\n\n\nAll 
    additional dates will be documented.\n 
</wd:Question_Employee_Comment> 

Это из .replace() вы специально просили о. Дальнейшая работа также выполняется с помощью полного выражения, такого как фиксация &amp;amp;, которая должна быть &amp;, и другие вещи выполняются. Я не сделал все эти преобразования здесь, поскольку они не были частью основного вопроса, который вы задали, но могли бы уточнить, если вы не понимаете эти части.

+0

Спасибо Дэн за такой быстрый и подробный ответ. Теперь этот фрагмент кода имеет смысл. –

+0

Вот полное выражение: 'code' <выражение name =" выражение "type =" javascript "> (dataSetRow [" Question_Employee_Comment "] + dataSetRow [" Question_Manager_Comment "]). Replace (/ (< ([^>] +)>)/ig, "\ n"). replace (/ null/ig, "") .replace (/ & amp;/g, "&") .replace (/ & # 39;/g, "'") .replace (/ & nbsp;/g, "") .replace (/ •/g, '\ n •') –

+0

Вот xml, на которое выражение смотрит: 'code' < p> Я даже не знаю, с чего начать ... Купидон не был @ его столом 14/14/2015, и я действительно расстроен, потому что я очень терпелив с его личными потребностями. Santa & amp; Я усадил его и обсудил, почему его участие важно для успеха. </р> < р> </р> < р> Он отсутствовал на: </р> < уль> < литий> 3/19/15 </li> < li> 20 марта 2015 </li> < li> 05/01/2015 </li>/ul> < p> </p> < p> Все дополнительные даты будут задокументированы. </p>

1

Эта функция replace заменит все теги XML новыми символами строки, оставив чистый текст без разметки.

Примечания:

  • replace функция предназначена для применения в XML; это не XML .
  • Он использует регулярное выражение для соответствия тегу XML. См. Dan's answer для отличного описания конструкций в регулярном выражении .
  • Regex is fundamentally the wrong way to process XML. Вместо этого используйте реальный парсер XML или XPath.
Смежные вопросы