regexp, как сначала сопоставить более длинные строки? - PullRequest
1 голос
/ 21 января 2020

Должен быть параметр / флаг для этого, который я пропустил с помощью matlab:

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

Как этого достичь?

regexpi('A quick brown fox jumps over the lazy dog.','quick|the|a','match','once')
%returns 'A', would like it to return 'quick'

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Вы могли бы сделать

>> regexpi('A quick brown fox jumps over the lazy dog.','.*?(quick)|.*?(the)|.*?(a)','tokens','once')

ans =

  1×1 cell array

    {'quick'}

, но это довольно уродливо. Другое решение, которое выглядит менее уродливо, это

>> str = "A quick brown fox jumps over the lazy dog.";
>> list = ["quick" "the" "a"];

>> list(find(arrayfun(@(x)contains(str,x), list), 1))

ans = 

    "quick"

Мне кажется, решение Томаса мне нравится больше всего.

1 голос
/ 21 января 2020

Может быть, вы можете попробовать следующий код

% match all possible key words, don't use argument 'once' in `regexpi()`
v = regexpi('A quick brown fox jumps over the lazy dog.','quick|the|a','match');
% calculate the lengths of matched words
lens = cellfun(@length,v);
% output the longest word
v{lens == max(lens)}

такой, что

ans = quick
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...