107 votes

Comment pouvons-nous faire correspondre un ^ nb ^ n avec une expression rationnelle Java?

Cette est la deuxième partie d'une série d'actions éducatives regex articles. Il montre comment lookaheads et les références imbriquées peuvent être utilisés pour correspondre à la non-régulière languge anbn. Les références imbriquées sont d'abord introduits dans: Comment cette regex trouver triangulaire numéros?

L'un de l'archétype du non-langages réguliers est:

L = { anbn: n > 0 }

C'est la langue de tous les non-vide cordes composé d'un certain nombre de a'suivi d'un nombre égal de b'. Exemples de chaînes de caractères dans cette langue sont ab, aabb, aaabbb.

Ce langage peut être montrer à des non-régulière, par le lemme de pompage. C'est en fait un archétype du contexte de la langue, qui peut être généré par le contexte de la grammaire S → aSb | ab.

Néanmoins, moderne regex implémentations reconnaissent clairement plus que juste des langages réguliers. Qui est, ils ne sont pas "régulière" par le langage formel de la théorie de la définition. PCRE et Perl supporte récursive regex, et .NET prend en charge l'équilibrage des groupes de définition. Encore moins de "fantaisie", par exemple la référence arrière de correspondance, signifie que la regex n'est pas régulière.

Mais juste comment puissant est cette "base" de fonctionnalités? Peut-on reconnaître L avec Java regex, par exemple? Pouvons-nous peut-être combiner lookarounds et les références imbriquées et d'avoir un modèle qui fonctionne avec, par exemple, String.matches pour correspondre à cordes, comme ab, aabb, aaabbb, etc?

Références

Liés à des questions

22voto

jaytea Points 290

Etant donné que rien n’a été fait pour que PCRE prenne en charge des modèles récursifs, je voudrais simplement souligner l’exemple le plus simple et le plus efficace de PCRE qui décrit le langage en question:

 /^(a(?1)?b)$/
 

15voto

KennyTM Points 232647

Comme mentionné dans la question - avec .NET de l'équilibrage de groupe, les modèles du type unnbncndnzn peut être adapté facilement que

^
  (?<A>a)+
  (?<B-A>b)+  (?(A)(?!))
  (?<C-B>c)+  (?(B)(?!))
  ...
  (?<Z-Y>z)+  (?(Y)(?!))
$

Par exemple: http://www.ideone.com/usuOE


Edit:

Il y a aussi un PCRE modèle pour le langage généralisé avec récursive modèle, mais une anticipation est nécessaire. Je ne pense pas que c'est une traduction directe de la ci-dessus.

^
  (?=(a(?-1)?b))  a+
  (?=(b(?-1)?c))  b+
  ...
  (?=(x(?-1)?y))  x+
     (y(?-1)?z)
$

Par exemple: http://www.ideone.com/9gUwF

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X