Соответствие при каждом втором возникновении

в SSRS 2016 я могу использовать

= any(string_to_array(@parameter, ','))

, а также учитывать несколько значений

enter image description here

44
задан Shyam 12 August 2013 в 03:08
поделиться

6 ответов

Используйте группировку.

foo.*?(foo)
61
ответ дан Alex Barrett 26 November 2019 в 22:06
поделиться

Предположим шаблон, который Вы хотите, abc+d. Вы хотите соответствовать второму возникновению этого шаблона в строке.

Вы создали бы следующий regex:

abc+d.*?(abc+d)

Это соответствовало бы строкам формы: <your-pattern>...<your-pattern>. Так как мы используем неохотный спецификатор *? мы в безопасности, что не может быть другого соответствия между двумя. Используя matcher группы, которые в значительной степени предоставляют все regex реализации, Вы тогда получили бы строку в группе на кронштейнах, которая является тем, что Вы хотите.

9
ответ дан Il-Bhima 26 November 2019 в 22:06
поделиться

При использовании C# можно или получить все соответствия сразу (т.е. использование Regex.Matches(), который возвращается MatchCollection, и проверьте индекс объекта: index % 2 != 0).

, Если Вы хотите найти, что возникновение заменяет его, используйте одну из перегрузок Regex.Replace(), который использует MatchEvaluator (например, Regex.Replace(String, String, MatchEvaluator). Вот код:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "abcdabcd";

            // Replace *second* a with m

            string replacedString = Regex.Replace(
                input,
                "a",
                new SecondOccuranceFinder("m").MatchEvaluator);

            Console.WriteLine(replacedString);
            Console.Read();

        }

        class SecondOccuranceFinder
        {
            public SecondOccuranceFinder(string replaceWith)
            {
                _replaceWith = replaceWith;
                _matchEvaluator = new MatchEvaluator(IsSecondOccurance);
            }

            private string _replaceWith;

            private MatchEvaluator _matchEvaluator;
            public MatchEvaluator MatchEvaluator
            {
                get
                {
                    return _matchEvaluator;
                }
            }

            private int _matchIndex;
            public string IsSecondOccurance(Match m)
            {
                _matchIndex++;
                if (_matchIndex % 2 == 0)
                    return _replaceWith;
                else
                    return m.Value;
            }
        }
    }
}
6
ответ дан MarredCheese 26 November 2019 в 22:06
поделиться

Обратные ссылки могут найти интересные решения здесь. Этот regex:

([a-z]+).*(\1)

найдет самую длинную повторную последовательность.

Этот найдет последовательность 3 букв, которая повторяется:

([a-z]{3}).*(\1)
2
ответ дан Jeff Moser 26 November 2019 в 22:06
поделиться

Что-то хотело бы

(pattern.*?(pattern))*

работа для Вас?

Редактирование:

проблема с этим состоит в том, что это использует нежадный оператор *?, который может потребовать очень большого отслеживания в обратном порядке вдоль строки вместо того, чтобы просто смотреть на каждую букву однажды. То, что это означает для Вас, - то, что это могло быть медленно для больших разрывов.

2
ответ дан MarredCheese 26 November 2019 в 22:06
поделиться

Нет никакого "прямого" способа сделать так, но можно определить шаблон дважды как в: a[^a]*a, что соответствие до второго "a".

альтернатива должна использовать Ваш язык программирования (жемчуг? C#?...) для соответствия первому вхождению и затем второму.

РЕДАКТИРОВАНИЕ : я видел другой, ответил с помощью "нежадных" операторов, которые могли бы быть хорошим способом пойти, предположив, что у Вас есть они в Вашей regex библиотеке!

0
ответ дан Remo.D 26 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

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