Я новичок в регулярных выражениях, и, похоже, я не нахожу выхода с этими шаблонами. Я пытаюсь сопоставить пунктуацию в предложении (кавычки и вопросительный знак) без успеха.
Вот мой код:
string sentence = "\"This is the end?\"";
string punctuation = Regex.Match(sentence, "[\"?]").Value;
Что я здесь делаю неправильно? Я ожидал, что консоль отобразит "?", однако она показывает мне двойную кавычку.
@canton7 canton7, как мне сделать так, чтобы он соответствовал любой кавычке и вопросительному знаку?
@TheThugger Это должно работать \?\" или (\?\")
@WaelAbbas по-прежнему не помогает. Он соответствует кавычке только один раз.
вам нужно перебирать Regex.Matches
@TheThugger использует Regex.Match("\"This is the?\" end?\"", "(\\?\")+").Groups и возвращает результат в цикле





Вам нужно вызвать Matches вместо Match.
Пример:
string sentence = "\"This is the end?\"";
var matches = Regex.Matches(sentence, "[\"?]");
var punctuationLocations = string.Empty;
foreach(Match match in matches)
{
punctuationLocations += match.Value + " at index:" + match.Index + Environment.NewLine;
}
// punctuationLocations:
// " at index:0
// ? at index:16
// " at index:17
Если вы хотите сопоставить все кавычки и вопросительные знаки, как указано в вашем вопросе, тогда ваш шаблон в порядке. Проблема в том, что Regex.Match вернет только найденное совпадение первый. Из MSDN:
Searches the input string for the first occurrence of the specified regular expression...
Вероятно, вы захотите использовать Matches:
string sentence = "\"This is the end?\"";
MatchCollection allPunctuation = Regex.Matches(sentence, "[\"?]");
foreach(Match punctuation in allPunctuation)
{
Console.WriteLine("Found {0} at position {1}", punctuation.Value, punctuation.Index);
}
Это вернет:
Found " at position 0
Found ? at position 16
Found " at position 17
Я также хотел бы отметить, что если вы действительно хотите сопоставить знаки препинания все, включая такие вещи, как «французские» кавычки (« и »), «умные» кавычки (“ и ”), перевернутые вопросительные знаки (¿) и многие другие , вы можете использовать Категории символов Юникода с таким шаблоном, как \p{P}.
Ваш код выводит для меня
"(символ двойной кавычки), а не пустую строку.["?]означает" OR ?, поэтому он соответствует начальной двойной кавычке.