Как мне найти строку, которая не находится в кавычках? - PullRequest
0 голосов
/ 06 июля 2011

Я хотел бы найти строку, скажем, "bazinga", но только если она не в кавычках (одинарная или двойная). когда я говорю кавычки, я имею в виду не экранированные.

например.

при использовании этого в качестве ввода должно возвращаться 13 (индекс найденного совпадения)

"the fox is" //bazinga

и использование этого в качестве ввода должно возвращать 18 (поскольку кавычки вокруг строки экранированы)

"bla bla \"//bazinga\"

при использовании этого в качестве ввода должно возвращаться -1 (не найдено)

"bla bla \"//bazinga"

использование этого в качестве входных данных должно возвращать 16 (первый находится внутри кавычек, поэтому не считается)

"bla //bzinga"  //bazinga

при использовании любого из них в качестве ввода должно возвращаться -1 (не найдено)

"bbbb //bazinga"
'bbbb //bazinga'

Ответы [ 4 ]

2 голосов
/ 06 июля 2011

Я бы посоветовал взглянуть на:

Библиотека RegEx для строк

Он содержит много RegEx, которые вы можете протестировать непосредственно на сайте и изменить в соответствии с вашими потребностями. Я всегда использую его как источник, когда мне нужно работать с RegEx. Вы можете использовать одинарные и двойные кавычки как «escape-символы» и соответственно определять свой RegEx.

1 голос
/ 06 июля 2011
int getIndexWithoutQ(string find)
{
int index = -1;
string search = "";
for (int i = 0; i < find.Length; i++)
{
while (find[i] == '\"')
 i++;
if (i < find.Length)
  search += find[i];
}

if (search.IndexOf(find) == -1)
   return -1;
while (this.insideQ(all, find, index = all.IndexOf(find)));
return index;
}

bool insideQ(string all, string find, int begin)
{

}
1 голос
/ 06 июля 2011

Вам нужно немного разбора, чтобы сделать это. Вы можете искать экранированные кавычки, строку в кавычках или текст, который вы хотите сопоставить, и анализировать, что вы получаете. Что-то вроде:

MatchCollection matches = Regex.Matches(
  input,
  "(/\"|/'|\"[^\"]*\"|'[^']*'|" + Regex.Escape("//bazinga") + ")"
);

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

Если какой-либо из текстов является вашим текстом, вы нашли его.

Редактировать

С этим входом:

string input = "asdf /\" /' '//bazinga'  \"//bazinga\" //bazinga";

Я провел матч, а затем показал результат, используя:

foreach (Match match in matches) {
  Console.WriteLine("{0} {1}", match.Index, match.Value);
}

Выход:

5 /"
8 /'
11 '//bazinga'
24 "//bazinga"
36 //bazinga

Вы можете использовать такой код, чтобы получить индексы фактических попаданий в коллекции совпадений:

int[] found =
  matches.Cast<Match>()
  .Where(m => m.Value == "//bazinga")
  .Select(m => m.Index)
  .ToArray();
1 голос
/ 06 июля 2011

С этим входом:

This is "bazinga" asdf

И это регулярное выражение:

["][a-zA-Z\x20]+["]

Вы можете запустить Split вместо Search и получить этот вывод:

This is
asdf

Я рекомендую получить этот бесплатный инструмент: Expresso

http://www.ultrapico.com/

...