2013-07-03 4 views
1

Я пытаюсь написать регулярное выражение javascript, соответствующее только комментариям стиля NASM в HTML. Например, сопоставление "; interrupt" для "INT 21h ; interrupt".регулярное выражение javascript с несколькими круглыми скобками

Возможно, вы знаете, что /;.*/ не может быть ответом, поскольку перед комментарием может быть объект HTML; Я думал, что /(?:[^&]|&.+;)*(;.*)$/ должны работать для этого, но я обнаружил, что есть две проблемы:

  1. "      ; hello world".match(/(?:[^&]|&.+;)*(;.*)$/) является массивом ["      ; hello world", "; hello world"]. Я не хочу массив.
  2. "      ; hello world; a message".match(/(?:[^&]|&.+;)*(;.*)$/) является ["      ; hello world; a message", "; a message"]; еще хуже второй элемент.

Вопрос:

  1. Почему (?:) блок возвращается?
  2. Почему "; a message", а не "; hello world; a message"?
  3. Какое правильное регулярное выражение я могу использовать?

ответ

0

объявления 1.) ?: блока не возвращаются. вместо этого полное совпадение возвращается в первом элементе массива. это поведение следует за спецификацией для неглобального соответствия (т. е. без опции g).

ad 2.) Первая часть вашего регулярного выражения ((?:[^&]|&.+;)*) соответствует слишком много. на самом деле это будет соответствовать полной строке, если вы уронили вторую часть. на простом английском языке вы попросили согласовать последовательность &, за которой следует как можно больше символов, а затем ; или любой символ, отличный от &, и вы просите двигатель повторить это совпадение как можно чаще до последнего ; в тестовая строка (если она есть).

ad 3.) попробовать

(?:[^&;]*(&[a-zA-Z0-9_-]+;[^&;]*)*)(;.*)$ 

он фиксирует сломанное соответствие сущности и возвращает самый длинный ; -initial суффикса.

проверено с pagecolumn regex tester (я не являюсь аффилированным лицом с этим сайтом).

+0

Спасибо! После изменения вашего примера на '(?: [^ &;] * (?: &[^\s;] +; [^ &;] *) *) (;. *) $' Для ухода за объектами типа '& # xAC01;', I решил использовать '(?: [^ &;] | &[^; \ s] +;) * (;. *) $'. –

1

1) (? :) не возвращается. То, что вы видите, это то, что метод .match() будет всегда возвращает массив: первый элемент - это полное совпадение, а следующие элементы (если есть) - обратные ссылки. В этом случае у вас есть одна обратная ссылка, поэтому массив содержит два элемента.

2) Из первой половины вашего регулярного выражения:

(?:[^&]|&.+;)* 

Это не очень хорошая идея! Это будет соответствовать примерно что-нибудь, даже включая новые линии! Фактически, только вещь это не будет соответствовать «&», за которым не следует «;» на той же линии. Таким образом, он сопоставляет все до последнего »; в каждой из ваших линий.

3) Я не совсем знаком с комментариями стиля MASM в HTML, поэтому мне нужно будет увидеть более обширный список того, что вы хотите совместить/не сопоставлять, чтобы уверенно дать хороший ответ здесь.

Но вот то, что я бросил вместе очень быстро, по крайней мере, решить два примера вы дали выше:

.*&.*?;\s(;.*)$ 
+0

Спасибо! Хотя ваш пример не может быть принят для общих случаев, упоминание о многострочном поле было очень полезно. –

Смежные вопросы