2016-04-08 3 views
3

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

Моей картина

/\/((?:.|)+)\//g 

Моего текст

|==== Données ====> 
    byteCode = 
    { 
     id : [], 
     tag : [], 
     ast : [] 
    }; 
<==== Données ====| 

|==== Filtres ====> 
    *EspaceBlanc  => /\t|\n|/    ;; 
<==== Filtres ====| 

|==== Terminaux ====> 
    $PrefixeId   => /#/      ;; 
    $$Mot    => /[0-9aA-zZ-]/   ;; 
    $SufixeInstruction => /;/      ;; 
    $Separateur   => /,/      ;; 
    $Enfant    => /:/      ;; 
    $$Portée   => /\|/ :: caractère.length ;; 
<==== Terminaux ====| 

|==== NonTerminaux ====> 
    @Tag => $Mot :: 
    { 
     const nomTag = uniSem[0].toSource(); 
     const index = byteCode.tag.indexOf(nomTag); 
     // Si indexTag non présent Alors index ajout byte code 
     return (index >= 0)? index: (byteCode.tag.push(nomTag) - 1); 
    };; 

    @Id => ~$PrefixeId, $Mot :: byteCode.id.push(uniSem[1].toSource()) - 1; 

    @Elément => @Tag, [@Id] :: 
    { 
     const indexTag = uniSem[0].toSource(); 
     const id = (uniSem[1])? uniSem[1].toSource() : -1; 
     return byteCode.ast.push([indexTag, id]) - 1; 
    };; 

    @InstructionSimple => @Elément, ~$SufixeInstruction :: uniSem[0].toSource();; 

    @Instruction => 
    $Elément, ~$Enfant, 
    [{ @Elément, ~$Separateur } ], 
    @InstructionSimple :: 
    { 
     const idParent = uniSem[0].toSource(); 
     for(let i = 1, iMax = uniSem.length - 1; i < iMax; i++) 
     { 
      byteCode.ast[idParent].push(uniSem[i].toSource()); 
     } 
     // ajout de InstructionSimple 
     return byteCode.ast[idParent].push(uniSem[uniSem.length - 1].toSource()); 
    }; 
<==== NonTerminaux ====| 

|==== Terminale ====> 
    console.log('C\'est la fin!!'); 
<==== Terminale ====| 

Все регулярные выражения совпадают, но это не удается:

/\t|\n|/

Исходный код:

const motif = /\/((?:.|)+)\//g; 
//source is the text in stackoverflow description 
let trouvé = null; 
while(trouvé = motif.exec(source)) 
{ 
    console.log('trouvé!!', trouvé.index); 
} 

Результат:

  • Trouvé !! 210
  • trouvé !! 236
  • trouvé !! 278
  • trouvé !! 308
  • trouvé !! 335
  • trouvé !! 363
  • trouvé !! 367
  • trouvé !! 697
  • trouvé !! 983

Ожидаемое:

  • Trouvé !! 136
  • trouvé !! 210
  • trouvé !! 236
  • trouvé !! 278
  • trouvé !! 308
  • trouvé !! 335
  • trouvé !! 363
  • trouvé !! 367
  • trouvé !! 697
  • trouvé !! 983

https://jsfiddle.net/4bx7hboz/5/

РЕДАКТИРОВАТЬ: Шаблон матча на regexr.com или regex101.com. Это не работает в консоли, потому что «\ t» не найден был разобран и шаблон не соответствует \ t parsed ... Я размышляю о способе хранения строки без разбора слов, представляю специальный символ, такой как \ т.

Благодарим вас за помощь и не беспокоитесь о языке моего текста (это не javascript).

+0

@ user2138045 [Ваш RegEx работает?] (Https://regex101.com/r/hP6gT7/1) – Druzion

+1

Может быть, вы могли бы прийти к этому [чат] (http://chat.stackoverflow.com/rooms/108634/regexp-not-matching-all-pattern), чтобы обсудить это? –

+1

Btw, '(?:. |)' Бессмысленно. '.' уже соответствует пробелам. – Bergi

ответ

2

После исследования, странное поведение engendred при использовании

var = '/\tstring/'; 

В этом случае была строка использована, содержащихся вар и \ т преобразуются в один символ (код 9). Для позволяют регулярное выражение, чтобы сделать соответствующие особые слова, такие как \ т вы делаете, чтобы не разобрать строку с


var = String.raw `/\tstring/\`; 

На самом деле с этим решением, вы можете differenciate \ т специальный код carácter 9


Если вы заинтересованы с помощью регулярных выражений для поиска регулярных выражений шаблона вы можете использовать это:

/\/([^*].*)\// 

Благодаря @Thomas и @Bergi

https://jsfiddle.net/matthis/9mnzda3d/2/

+1

В JavaScript это выражение будет соответствовать комментариям, которые начинаются с двойной косой черты и содержат косую черту. Например: '// Это комментарий/примечание'. Чтобы предотвратить это, измените выражение на использование квантора '+' вместо '*': '\/([^ *]. +) \ /' Для этого потребуется совпадение, по крайней мере, одного токена между косой чертой. – gfullam

+0

Да, вы правы, но я не могу заменить + на *, потому что это вызывает непризнанный шаблон с регулярным выражением только одного символа. Я работаю над тем, чтобы предотвратить распознавание комментария, не препятствуя распознаванию небольшого шаблона, такого как/#/g. – Ybasthis

+0

Я вижу. Я не думаю, что для этого сценария существует регулярное выражение catch. Вы должны полагаться на ожидание того, что код в строке не содержит этих комментариев или вам нужно написать дополнительный код для их учета. – gfullam

Смежные вопросы