Можем ли мы повторно посетить основную причину, по которой мы хотели, чтобы наш класс вел себя как Thread
? Нет никакой причины, мы просто хотели выполнить задачу, скорее всего, в асинхронном режиме, что точно означает, что выполнение задачи должно входить из нашего основного потока и основного потока, если заканчивается раньше, может или не может ждать для разветвленного пути (задачи).
Если это целая цель, то где я вижу потребность в специализированном потоке. Это может быть достигнуто путем сбора RAW-потока из пула потоков в системе и назначения его нашей задачи (может быть экземпляром нашего класса), и это все.
Итак, будем подчиняться концепции ООП и писать класс типа, который нам нужен. Есть много способов сделать что-то, делайте это правильно.
Нам нужна задача, поэтому напишите определение задачи, которое можно запустить в потоке. Поэтому используйте Runnable.
Всегда помните, что implements
специально используется для придания поведения, а extends
используется для передачи функции / свойства.
Мы не хотим, чтобы свойство потока , вместо этого мы хотим, чтобы наш класс работал как задача, которая может быть запущена.
Обратите внимание, что \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
Обратите внимание, что \'.*\'
и \[.*\]
может слишком много совместить, подумайте о замене на \'[^\']*\'
и \[[^][]*\]
.
На каком языке / приложении вы используете это регулярное выражение? Если у вас есть опция, вы можете указать разные части как именованные переменные, а затем построить окончательное регулярное выражение, объединив их.
val = "([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])"
op = "(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)"
exp = "(\(" .. val .. "\s*" .. op .. "\s*" .. val .. "\))"
(?&Val)
должен быть завернут в отдельную группу захвата, чтобы также зафиксировать значение, следовательно((?&Val))
. – Wiktor Stribiżew 17 August 2016 в 09:21((a+1)==(b*5))
.. в этом случае мое выражение будет соответствовать только двум выражениям(a+1)
и(b*5)
, как я могу настроить его в соответствии со всем выражением!? – Ahmad Hajjar 17 August 2016 в 10:02/\((?>[^()]++|(?R))*\)/
, а затем проанализируйте каждый с вашим выражением. Или избавитесь от всех этих причудливых вещей, затем используйте/[a-zA-Z]+[0-9]*|[0-9]+|\'[^\']*\'|\[[^][]*\]/
. – Wiktor Stribiżew 17 August 2016 в 10:05