Нахождение всех моделей с RE

У меня была аналогичная проблема, но мне пришлось заменить массив терминов. Все решения, которые я нашел, не сработали, если два слова находились в тексте рядом друг с другом (поскольку их границы перекрывались). Поэтому мне пришлось использовать небольшой модифицированный подход:

var text = "Ještě. že; \"už\" à. Fürs, 'anlässlich' že že že.";
var terms = ["à","anlässlich","Fürs","už","Ještě", "že"];
var replaced = [];
var order = 0;
for (i = 0; i < terms.length; i++) {
    terms[i] = "(^\|[ \n\r\t.,;'\"\+!?-])(" + terms[i] + ")([ \n\r\t.,;'\"\+!?-]+\|$)";
}
var re = new RegExp(terms.join("|"), "");
while (true) {
    var replacedString = "";
    text = text.replace(re, function replacer(match){
        var beginning = match.match("^[ \n\r\t.,;'\"\+!?-]+");
        if (beginning == null) beginning = "";
        var ending = match.match("[ \n\r\t.,;'\"\+!?-]+$");
        if (ending == null) ending = "";
        replacedString = match.replace(beginning,"");
        replacedString = replacedString.replace(ending,"");
        replaced.push(replacedString);
        return beginning+"{{"+order+"}}"+ending;
    });
if (replacedString == "") break;
order += 1;
}

См. Код в скрипке: http://jsfiddle.net/antoninslejska/bvbLpdos/1/

Регулярное выражение вдохновлено: http://breakthebit.org/post/3446894238/word-boundaries-in-javascripts-regular

Я могу " t сказать, что я нахожу решение элегантным ...

4
задан Drxxd 27 February 2019 в 14:57
поделиться

1 ответ

Вы можете использовать

\([a-z]\)\s+([a-z]+)(?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important)

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

Подробности

  • \([a-z]\) - строчная буква внутри скобок
  • \s+ - 1+ пробелы
  • ([a-z]+) - Группа 1: одна или несколько строчных букв внутри скобок
  • (?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important) - a положительный прогноз, соответствующий местоположению, за которым сразу следует
    • (?:\s*,\s*\([a-z]\)\s+[a-z]+)* - 0 или более повторений
      • \s*,\s* - запятой, заключенной в 0+ пробелов
      • [119 ] - буква, заключенная в скобки [li> \s+ - 1+ пробелы
      • [a-z]+ - 1+ строчные буквы
      • \s*,\s* - запятая, заключенная в 0+ пробелов
      • \([a-z]\) - строчная буква внутри скобок
      • \s+ - 1+ пробелов
      • important - a слово.

    Демо Python :

    import re
    strs = ["(a) first, (b) second, (c) important", "(a) aa, (b) cc, (c) dd, (d) oi, (e) important", "(a) aa, (b) asdf, (c) wer" ]
    r = re.compile(r'\([a-z]\)\s+([a-z]+)(?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important)')
    for s in strs:
        print(r.findall(s))
    

    Вывод:

    ['first', 'second']
    ['aa', 'cc', 'dd', 'oi']
    []
    
0
ответ дан Wiktor Stribiżew 27 February 2019 в 14:57
поделиться
Другие вопросы по тегам:

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