Название может показаться немного рекурсивным, и это действительно так.
Я работаю над Javascript, который может выделять/раскрашивать код Javascript, отображаемый в HTML. Таким образом, в интернет-браузере комментарии будут окрашены в зеленый цвет, определения (для, если, пока и т. д.) будут выделены темно-синим цветом и курсивом, числа будут красными и так далее для других элементов. Впрочем, окраска не так уж и важна.
Я пытаюсь выяснить два разных регулярных выражения, которые начали вызывать небольшую головную боль.
1. Поиск регулярного выражения с помощью регулярного выражения
Я хочу найти регулярные выражения в тегах сценариев HTML, используя Javascript, например:
match(/findthis/i);
, где часть регулярного выражения, конечно, "/findthis/i".
Правила следующие:
- Поиск нескольких вхождений (/g) не важен.
- Он должен быть на той же строке (не /m).
- Регистронезависимый (/i).
- Если за обратной косой чертой (символом игнорирования) следует непосредственно прямая косая черта «/», косая черта является частью выражения, а не escape-символом. Например:
/itdoesntstop\/untilnow:/
- Две косые черты рядом друг с другом (//) это: (A) В начале: Не регулярное выражение; это комментарий. (B) Позже: первая косая черта — это конец регулярного выражения, а вторая косая черта — не что иное, как символ.
- Regex продолжается до тех пор, пока не встретится разрыв строки, или конец ввода (\n|$), или escape-символ (вторая косая черта, соответствующая правилу 4). Однако до тех пор, пока после второй косой черты встречаются только буквенные символы, они считаются частью регулярного выражения. Например:
/aregex/allthisispartoftheregex
Пока что у меня есть это:
'\\/(?:[^\\/\\\\]|\\/\\*)*\\/([a-zA-Z]*)?'
Однако это непоследовательно. Какие-либо предложения?
2. Найдите цифры (буквенно-цифровые, с плавающей запятой) с помощью регулярного выражения
Найти цифры самостоятельно несложно. Однако поиск плавающих чисел (с несколькими точками) и букв, включающих подчеркивание, является более сложной задачей.
Все перечисленные ниже считаются числами (после каждого пробела начинается новое число):
3 3.1 3.1.4 3a 3.A 3.a1 3_.1
Правила:
- Поиск нескольких вхождений (/g) не важен.
- Он должен быть на той же строке (не /m).
- Регистронезависимый (/i).
- Номер должен начинаться с цифры. Однако перед номером или после него может стоять символ, не являющийся словом (\W). Например: "=9,9;" где "9,9" - фактическое число. "a9" не число. Точка перед числом ".9" не считается частью числа, поэтому фактическим числом является "9".
- Допустимые символы: [a-zA-Z0-9_.]
Что у меня есть:
'(^|\\W)\\d([a-zA-Z0-9_.]*?)(?=([^a-zA-Z0-9_.]|$))'
Это работает не совсем так, как я хочу.