Javascript Regex для Javascript Regex и цифр

Название может показаться немного рекурсивным, и это действительно так.

Я работаю над Javascript, который может выделять/раскрашивать код Javascript, отображаемый в HTML. Таким образом, в интернет-браузере комментарии будут окрашены в зеленый цвет, определения (для, если, пока и т. д.) будут выделены темно-синим цветом и курсивом, числа будут красными и так далее для других элементов. Впрочем, окраска не так уж и важна.

Я пытаюсь выяснить два разных регулярных выражения, которые начали вызывать небольшую головную боль.

1. Поиск регулярного выражения с помощью регулярного выражения

Я хочу найти регулярные выражения в тегах сценариев HTML, используя Javascript, например:

    match(/findthis/i);

, где часть регулярного выражения, конечно, "/findthis/i".

Правила следующие:

  1. Поиск нескольких вхождений (/g) не важен.
  2. Он должен быть на той же строке (не /m).
  3. Регистронезависимый (/i).
  4. Если за обратной косой чертой (символом игнорирования) следует непосредственно прямая косая черта «/», косая черта является частью выражения, а не escape-символом. Например: /itdoesntstop\/untilnow:/
  5. Две косые черты рядом друг с другом (//) это: (A) В начале: Не регулярное выражение; это комментарий. (B) Позже: первая косая черта — это конец регулярного выражения, а вторая косая черта — не что иное, как символ.
  6. Regex продолжается до тех пор, пока не встретится разрыв строки, или конец ввода (\n|$), или escape-символ (вторая косая черта, соответствующая правилу 4). Однако до тех пор, пока после второй косой черты встречаются только буквенные символы, они считаются частью регулярного выражения. Например: /aregex/allthisispartoftheregex

Пока что у меня есть это:

    '\\/(?:[^\\/\\\\]|\\/\\*)*\\/([a-zA-Z]*)?'

Однако это непоследовательно. Какие-либо предложения?

2. Найдите цифры (буквенно-цифровые, с плавающей запятой) с помощью регулярного выражения

Найти цифры самостоятельно несложно. Однако поиск плавающих чисел (с несколькими точками) и букв, включающих подчеркивание, является более сложной задачей.

Все перечисленные ниже считаются числами (после каждого пробела начинается новое число):

3 3.1 3.1.4 3a 3.A 3.a1 3_.1

Правила:

  1. Поиск нескольких вхождений (/g) не важен.
  2. Он должен быть на той же строке (не /m).
  3. Регистронезависимый (/i).
  4. Номер должен начинаться с цифры. Однако перед номером или после него может стоять символ, не являющийся словом (\W). Например: "=9,9;" где "9,9" - фактическое число. "a9" не число. Точка перед числом ".9" не считается частью числа, поэтому фактическим числом является "9".
  5. Допустимые символы: [a-zA-Z0-9_.]

Что у меня есть:

'(^|\\W)\\d([a-zA-Z0-9_.]*?)(?=([^a-zA-Z0-9_.]|$))'

Это работает не совсем так, как я хочу.


person Kafoso    schedule 05.12.2012    source источник


Ответы (1)


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

/\/(?:[^\/\\\n\r]|\\.)+\/([a-z]*)/i

Я не знаю, что вы имели в виду со своей второй альтернативой после класса персонажа. Но здесь второй вариант используется для использования обратной косой черты и всего, что следует за ними. Последняя часть важна, чтобы вы могли распознать регулярное выражение, оканчивающееся примерно так: /backslash\\/. И ? в конце вашего регулярного выражения было лишним. В противном случае это должно быть хорошо.

Протестируйте здесь.

Ваше второе регулярное выражение отлично подходит для вашей спецификации. Однако есть несколько лишних элементов. Главное, что вы можете захотеть сделать, это захватить все, кроме возможного первого символа:

/(?:^|\W)(\d[\w.]*)/i

Теперь фактическое число (без первого символа) будет в группе захвата 1. Обратите внимание, что я удалил нежадность и просмотр вперед, потому что одна только жадность делает то же самое.

Протестируйте здесь.

person Martin Ender    schedule 05.12.2012
comment
Здравствуйте, м. Бюттнер. Спасибо за Ваш ответ! Регулярное выражение: Как видно из в этом примере регулярное выражение волшебным образом считает, что можно внезапно начать поиск в новых строках (at match(/r/r/r);). Проблема, с которой я постоянно сталкиваюсь. - person Kafoso; 06.12.2012
comment
Цифры: Работает прекрасно. Действительно, ваша упрощенная версия лучше. Спасибо. - person Kafoso; 06.12.2012
comment
@Kafoso ах да, строка обрывается. Смотрите мою правку. Просто включите символы разрыва строки в класс инвертированных символов. - person Martin Ender; 06.12.2012
comment
Оно работает. Благодарю вас! :) - Хотя меня все еще немного смущает тот факт, что он ищет несколько строк без / m. - person Kafoso; 06.12.2012
comment
@Kafoso m не имеет ничего общего с соответствием разрывам строк или нет. Все, что делает m, это заставляет ^ и $ совпадать в начале и конце строк соответственно. Ни больше ни меньше. . никогда не будет соответствовать разрыву строки (в JavaScript), независимо от того, используете ли вы m или нет. Но отрицательный класс символов означает любой символ, кроме..., включая разрывы строк. - person Martin Ender; 06.12.2012
comment
Очень верно. Мозг *арт. Спасибо еще раз. - person Kafoso; 07.12.2012