regex перестановка строк вхождения [дубликат]

В настоящее время нет способа выбрать родительский элемент элемента в CSS.

Если бы был способ сделать это, это было бы в любой из текущих спецификаций селекторов CSS:

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


Рабочий блок для выбора уровня 4 включает псевдокласс класса :has(), который работает аналогично реализации jQuery . По состоянию на 2018 год это все равно не поддерживается никаким браузером .

Используя :has(), исходный вопрос можно было бы решить с помощью этого:

li:has(> a.active) { /* styles to apply to the li tag */ }

37
задан Will Lanni 18 November 2016 в 20:28
поделиться

7 ответов

Используйте группу захвата, если вы хотите извлечь совпадения: (test) | (long) Затем, в зависимости от используемого языка, вы можете ссылаться на сопоставленную группу, например, с помощью $ 1 и $.

6
ответ дан Paul Lydon 19 August 2018 в 18:54
поделиться
  • 1
    Я использовал этот ответ в сочетании с (? I) из приведенного ниже ответа. Это привело к следующему выводу: (? I) (test (long)?), Потому что, оказывается, мне пришлось сначала протестировать тест, а затем долго. Если это правильный путь, это еще одна история, но это сработало для меня – RC1140 27 July 2009 в 10:05
  • 2
    Учитывая, что требование должно соответствовать тесту AND long, для этого решения нужен флаг g. – ChrisJJ 7 December 2016 в 23:04
32
ответ дан Community 19 August 2018 в 18:54
поделиться
  • 1
    Это не удается. regex101.com/r/Z8KOLp/2 – ChrisJJ 7 December 2016 в 23:36
  • 2
    @ChrisJJ указанное regexp не возвращает слова test или long. Но он возвращает совпадения, если он нашел слова test или long в любом порядке и возвращает non matches, если это не так. – velop 10 December 2016 в 22:04
  • 3
    Конечно, но нужно искать / извлекать слова, а не просто проверять их. – ChrisJJ 11 December 2016 в 13:35
  • 4
    Другой вариант: (?is)^(?=.*\b(test)\b)(?=.*?\b(long)\b).* , который также захватывает слова и соответствует всей строке. Дальнейшая привязка к ^ начинает значительно улучшать производительность. \b соответствует границе слова . – bobble bubble 20 July 2017 в 16:18

Попробуйте следующее:

/(?i)(?:test.*long|long.*test)/

Это будет соответствовать либо test, а затем long или long, а затем test. Он будет игнорировать различия в данных.

3
ответ дан Daniel C. Sobral 19 August 2018 в 18:54
поделиться
  • 1
    Вам не нужно (? I), если вы не хотите, чтобы он был чувствительным к регистру, но это работает. – Rob 6 November 2014 в 21:01

, не зная, какой язык

 /test.*long/ 

или

/long.*test/

или

/test/ && /long/
3
ответ дан ghostdog74 19 August 2018 в 18:54
поделиться
  • 1
    Я бы добавил границы слов, например. /\btest\b/. – Helen 24 July 2009 в 15:05

Я использовал libpcre с C, где я мог определять выноски. Они помогли мне легко совместить не только слова, но и любые подвыражения в любом порядке. Регулярное выражение выглядит так:

(?C0)(expr1(?C1)|expr2(?C2)|...|exprn(?Cn)){n}

, а функция выноски защищает то, что каждое подвыражение сопоставляется ровно один раз, например:

int mycallout(pcre_callout_block *b){
static int subexpr[255];
if(b->callout_number == 0){
    //callout (?C0) - clear all counts to 0
    memset(&subexpr,'\0',sizeof(subexpr));
    return 0;
}else{
    //if returns >0, match fails
    return subexpr[b->callout_number-1]++;
}
}

. Что-то вроде этого должно быть возможно и в perl .

1
ответ дан Juraj 19 August 2018 в 18:54
поделиться

Я предполагаю (всегда опасно), что вы хотите найти целые слова, поэтому «тест» будет соответствовать, но «testy» не будет. Таким образом, шаблон должен искать границы слов, поэтому я использую шаблон границы слова «\ b».

/(?i)(\btest\b.*\blong\b|\blong\b.*\btest\b)/
9
ответ дан Paul Chernoch 19 August 2018 в 18:54
поделиться

Я не думаю, что вы можете сделать это с помощью одного регулярного выражения. Вам понадобится логическое И из двух - поиск каждого слова.

-1
ответ дан phatmanace 19 August 2018 в 18:54
поделиться
Другие вопросы по тегам:

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