Здесь нет проблемы с остановкой. Все, что вам нужно, это вычислить, если пересечение ^xy1\d
и [^\d]\d2$
в непустое.
Я не могу дать вам алгоритм здесь, но вот два обсуждения метода для создания пересечения, не прибегая к построению DFA:
И тогда есть RAGEL
, который также может вычислять пересечение регулярных выражений.
UPDATE : Я только что пробовал Ragel с регулярным выражением OP. Ragel может генерировать «dot» файл для graphviz из конечного конечного автомата, что потрясающе. Пересечение регулярного выражения OP выглядит так в синтаксисе Ragel:
('xy1' digit any*) & (any* ^digit digit '2')
и имеет следующий автомат:
В то время как пустое пересечение:
('xy1' digit any*) & ('q' any* ^digit digit '2')
выглядит так:
Так что если все остальное не работает , вы все равно можете вычислить Ragel пересечение и проверить, выводит ли он пустую машину состояний, сравнивая сгенерированный «точечный» файл.
У этого подхода есть несколько потенциальных проблем, хотя во многих обстоятельствах (например, в вашем примере) он будет работать хорошо.
В частности, вы должны быть осторожны, имея дело со всем, что связано с GUI
, требующим Context
. Например, если вы передадите контекст приложения в LayoutInflater
, вы получите исключение. Вообще говоря, ваш подход превосходен: рекомендуется использовать Activity
Context
в этом Activity
и Application Context
при передаче контекста за пределы область действия Activity
- позволяет избежать утечек памяти .
Кроме того, в качестве альтернативы вашему шаблону вы можете использовать ярлык вызова getApplicationContext ()
для объекта Context
(например, Activity), чтобы получить контекст приложения.
LayoutInflater
, вы получите исключение. Вообще говоря, ваш подход превосходен: рекомендуется использовать Activity
Context
в этом Activity
и Application Context
при передаче контекста за пределы область действия Activity
- позволяет избежать утечек памяти .
Кроме того, в качестве альтернативы вашему шаблону вы можете использовать ярлык вызова getApplicationContext ()
для объекта Context
(например, Activity), чтобы получить контекст приложения.
LayoutInflater
, вы получите исключение. Вообще говоря, ваш подход превосходен: рекомендуется использовать Activity
Context
в этом Activity
и Application Context
при передаче контекста за пределы область действия Activity
- позволяет избежать утечек памяти .
Кроме того, в качестве альтернативы вашему шаблону вы можете использовать ярлык вызова getApplicationContext ()
для объекта Context
(например, Activity), чтобы получить контекст приложения.
По моему опыту, в таком подходе нет необходимости. Если вам нужен контекст для чего-либо, вы обычно можете получить его с помощью вызова View.getContext () и используя полученный там Context
, вы можете вызвать Context.getApplicationContext () , чтобы получить контекст приложения
. Если вы пытаетесь получить контекст Application
this из Activity
, вы всегда можете вызвать Activity.getApplication () , который можно передать как Контекст
, необходимый для вызова SQLiteOpenHelper ()
.
В целом, похоже, нет проблем с вашим подходом в этой ситуации,
Вы пытаетесь создать оболочку для получения контекста приложения, и есть вероятность, что она может вернуть указатель « null
».
Насколько я понимаю, это лучший подход к вызову - любой из двух
Context.getApplicationContext ()
или Activity.getApplication ()
.