Можно ли сделать группу захвата регулярных выражений переменной? [Дубликат]

Можем ли мы повторно посетить основную причину, по которой мы хотели, чтобы наш класс вел себя как Thread? Нет никакой причины, мы просто хотели выполнить задачу, скорее всего, в асинхронном режиме, что точно означает, что выполнение задачи должно входить из нашего основного потока и основного потока, если заканчивается раньше, может или не может ждать для разветвленного пути (задачи).

Если это целая цель, то где я вижу потребность в специализированном потоке. Это может быть достигнуто путем сбора RAW-потока из пула потоков в системе и назначения его нашей задачи (может быть экземпляром нашего класса), и это все.

Итак, будем подчиняться концепции ООП и писать класс типа, который нам нужен. Есть много способов сделать что-то, делайте это правильно.

Нам нужна задача, поэтому напишите определение задачи, которое можно запустить в потоке. Поэтому используйте Runnable.

Всегда помните, что implements специально используется для придания поведения, а extends используется для передачи функции / свойства.

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

1
задан Wiktor Stribiżew 17 August 2016 в 09:20
поделиться

2 ответа

Обратите внимание, что \g{N} эквивалентно \1, то есть backreference , который соответствует тому же значению , а не шаблону, который соответствует соответствующей группе захвата , Этот синтаксис немного более гибкий, поскольку вы можете определить группы захвата, которые относительны к текущей группе, используя - перед номером (т.е. \g{-2}, (\p{L})(\d)\g{-2} будет соответствовать a1a).

Механизм PCRE позволяет выполнять вызовы подпрограммы для рекурсии подшаблонов. Чтобы повторить шаблон группы 1, используйте (?1) и (?&Val) для повторения шаблона именованной группы Val.

Кроме того, вы можете использовать классы символов для соответствия одиночным символам и рассмотреть используя ? квантификатор, чтобы сделать части регулярного выражения необязательными:

(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|[*\/+-]|[=!><]=|[><])\s*((?&Val))\s*\))

См. демонстрацию regex

Обратите внимание, что \'.*\' и \[.*\] может слишком много совместить, подумайте о замене на \'[^\']*\' и \[[^][]*\].

3
ответ дан Wiktor Stribiżew 18 August 2018 в 19:28
поделиться
  • 1
    Обратите внимание, что (?&Val) должен быть завернут в отдельную группу захвата, чтобы также зафиксировать значение, следовательно ((?&Val)). – Wiktor Stribiżew 17 August 2016 в 09:21
  • 2
    oh человек много благодарен, что решил это +1 – Ahmad Hajjar 17 August 2016 в 09:24
  • 3
    и спасибо за совет, я изменю массив и строчные совпадения :) +1 – Ahmad Hajjar 17 August 2016 в 09:29
  • 4
    Кстати, если я хочу совместить рекурсивные выражения, такие как ((a+1)==(b*5)) .. в этом случае мое выражение будет соответствовать только двум выражениям (a+1) и (b*5), как я могу настроить его в соответствии со всем выражением!? – Ahmad Hajjar 17 August 2016 в 10:02
  • 5
    Если вы примените рекурсию, вы потеряете захват внутри нее. Вы действительно этого хотите? Используйте базовое выражение для сопоставления всех вложенных круглых скобок с /\((?>[^()]++|(?R))*\)/, а затем проанализируйте каждый с вашим выражением. Или избавитесь от всех этих причудливых вещей, затем используйте /[a-zA-Z]+[0-9]*|[0-9]+|\'[^\']*\'|\[[^][]*\]/ . – Wiktor Stribiżew 17 August 2016 в 10:05

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

val = "([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])"
op = "(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)"
exp = "(\(" .. val .. "\s*" .. op .. "\s*" .. val .. "\))"
1
ответ дан nolan 18 August 2018 в 19:28
поделиться
  • 1
    Я делаю это на самом деле, но я спрашиваю из любопытства: D – Ahmad Hajjar 17 August 2016 в 09:24
Другие вопросы по тегам:

Похожие вопросы: