в SSRS 2016 я могу использовать
= any(string_to_array(@parameter, ','))
, а также учитывать несколько значений
Предположим шаблон, который Вы хотите, abc+d. Вы хотите соответствовать второму возникновению этого шаблона в строке.
Вы создали бы следующий regex:
abc+d.*?(abc+d)
Это соответствовало бы строкам формы: <your-pattern>...<your-pattern>
. Так как мы используем неохотный спецификатор *? мы в безопасности, что не может быть другого соответствия между двумя. Используя matcher группы, которые в значительной степени предоставляют все regex реализации, Вы тогда получили бы строку в группе на кронштейнах, которая является тем, что Вы хотите.
При использовании 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;
}
}
}
}
Обратные ссылки могут найти интересные решения здесь. Этот regex:
([a-z]+).*(\1)
найдет самую длинную повторную последовательность.
Этот найдет последовательность 3 букв, которая повторяется:
([a-z]{3}).*(\1)
Что-то хотело бы
(pattern.*?(pattern))*
работа для Вас?
Редактирование:
проблема с этим состоит в том, что это использует нежадный оператор *?
, который может потребовать очень большого отслеживания в обратном порядке вдоль строки вместо того, чтобы просто смотреть на каждую букву однажды. То, что это означает для Вас, - то, что это могло быть медленно для больших разрывов.
Нет никакого "прямого" способа сделать так, но можно определить шаблон дважды как в: a[^a]*a
, что соответствие до второго "a".
альтернатива должна использовать Ваш язык программирования (жемчуг? C#?...) для соответствия первому вхождению и затем второму.
РЕДАКТИРОВАНИЕ : я видел другой, ответил с помощью "нежадных" операторов, которые могли бы быть хорошим способом пойти, предположив, что у Вас есть они в Вашей regex библиотеке!