Регулярное выражение для схемы раскраски синтаксиса

Swifty спросил: 28 марта 2018 в 01:53 в: regex

Я работаю над схемой раскраски синтаксиса для моего любимого языка программирования OOREXX. Язык не важен, так как мой вопрос касается только REGEX.

Простое описание: регулярное выражение, соответствующее любому набору слов, но у них должен быть префикс "~" или "( "суффикс" или оба

Полное описание: Я хочу соответствовать любому из сгустка или слов. Это имена функций. Это легко, что-то вроде:

(stream | Strip | Substr) и т. Д.

Но слово "полоса" (например) может появиться в моем коде, если не имя функции:

Strip = 1 - Установить переменную "Strip" to 1

Итак, мне нужно быть более точным. Имена функций должны иметь либо ведущий "~", либо "trailing" ("или оба

). Здесь мой навык REGEX я мог обойти это в моей схеме раскраски, используя два элемента: один, чтобы поймать "полосу" и один, чтобы поймать полосу ("но это означает дублирование и сохранение списка имен функций". Это идет вразрез с зерном ...


2 ответа

Есть решение
Sebastian Proske ответил: 28 марта 2018 в 02:16

Просто используйте чередование. В случае, если поддерживаются lookbehinds, вы можете использовать

(?<=~)strip|strip(?=\()

Если вы хотите что-то необычное и ваш движок регулярных выражений поддерживает lookbehind, и если предложения, вы можете избежать чередования - хотя это не будет более производительный, например

((?<=~))?strip(?(1)|(?=\())

И если у вас нет lookbehinds, вы все равно можете использовать группирование и извлекать из захваченных групп, например,

~(strip)|(strip)\(
Swifty ответил: 28 марта 2018 в 05:27
Спасибо! В вашем первом выражении "полоса" появляется дважды. В моей версии это будет (... stream | strip | substr ...) примерно для 70 альтернатив. Итак, я вернусь, дублируя список имен. Я собираюсь попробовать второе выражение, если оно работает в моем редакторе.
Swifty ответил: 29 марта 2018 в 03:47
Выражение № 2 работало в моей схеме раскраски синтаксиса EditPadPro "как есть". Мой O'Reilly"Освоение регулярных выражений" вызывает lookbehinds"Backreferences" и использует \ 1 в качестве ссылки, называя ее метапоследовательностью. Это вызвало у меня значительную путаницу, отсюда и отсрочка.
Ralph Torello ответил: 28 марта 2018 в 02:21

Я рекомендую (более и более) использовать http://regexr.com для проверки регулярных выражений. Я не связан с ними, но я программирую регулярные выражения 8 часов в день (иногда) ... Это хороший инструмент для их практики .... Но , чтобы ответить ваш вопрос (на Java) ...

Также обязательно просмотрите снимок экрана после кода, приведенного ниже.

// If there is a matching function name within this string, this will
// return that name, otherwise, it will return null.
public static String functionName(String functionNameStr)
{
    // This Regular Expression Groups the symbols before, or after, or both!
    // No, really, that's what it says...    String  RE = "(~\\w+|\\w+\\)|~\\w+\\))";    // NOTE: In Java, escape characters need to be Escaped Twice!
    // ALSO NOTE: This version puts a "precedence" on catching both symbols!
    // RE = "(~\\w+\\)|~\\w+|\\w+\\))"
    // Since the ~func-name) is listed first, if both symbols are included,
    // it will catch that too.  Maybe this is relevant to your code/question.    Pattern P1 = Pattern.compile(RE);
    Matcher m  = P1.matcher(functionNameStr); 
    if (m.find())  return m.group();
    else           return null;
}

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