#c# #windows #regex
#c# #Windows #регулярное выражение
Вопрос:
У меня есть строка типа CAIRN-CA-200, и я хочу сопоставить CA с этой строкой и хочу заменить ее на string.empty но ее не следует заменять на CAIRN, ее следует заменить на CA, к которому присоединяется hypen (-). Эта строка также может быть CAIRN CA 200, тогда ей также следует сопоставлять только слово CA, оно не должно совпадать с CAIRN, что означает, что строка должна сопоставляться только со всем словом, как здесь, это CA, и не должна совпадать с подстрокой какого-либо слова. Как этого добиться?
Одна вещь заключается в том, что перед и после этого слова не будет никаких алфавитных или цифровых символов, таких как дефис.
Итак, одним из решений может быть посмотреть, являются ли начало и конец слова не алфавитным или числовым, тогда это слово должно быть сопоставлено, но я не знаю, как написать регулярное выражение для этого. То есть как сопоставить слово, заключенное в символ, который не является алфавитным или числовым?
Я пробовал с такой штукой, как string regex ="^[a-zA-Z0-9_]" "CA" "^[a-zA-Z0-9_]"
, но это не работает.
Ответ №1:
resultString = Regex.Replace(subjectString, @"bCAb", "");
ничего не заменяет CA
, только если оно найдено как целое слово. b
это привязка к границе слова, которая совпадает только в начале или конце буквенно-цифрового «слова».
Ваше регулярное выражение завершается ошибкой, потому что ^
находится за пределами символьного класса, что означает «совпадение в начале строки».
Если вы также хотите заменить окружающие символы, вы могли бы использовать
"[^a-zA-Z0-9_]" "CA" "[^a-zA-Z0-9_]"
Внутри символьного класса ^
отрицает содержимое класса, как вы и предполагали. Обратите внимание, что это приведет к сбою, если CA
находится в начале или конце строки.
Комментарии:
1. Извините, у меня ваше первое регулярное выражение работает нормально. Это для замены на empty, но могу ли я проверить перед заменой, например, есть ли @» bCA b» в строке CAIRN-CA- или как CAIRN-PA? Потому что мне нужно еще кое-что проверить с этой строкой, например, если она содержит слово PA, то замените его на empty, например, содержит ли она PUT, который заменяет PUT на empty и так далее.
2. Я не совсем уверен, что понимаю. Вы хотите заменить
CA
andPA
иPUT
на empty в одном регулярном выражении? Нет проблем:@"b(CA|PA|PUT)b"
будет соответствовать любому из них.
Ответ №2:
var r = "CA";
var source = "CAIRN-CA-200";
var result = Regex.Replace(source, "([^\w\d_])" r "\1", "$1$1");
Это заменит любое R, которое не окружено a-z, 0-9 или _, при условии, что они совпадают, следующее допускает разные окружения и будет совпадать в начале или конце строки
var r = "CA";
var source = "CAIRN-CA-200";
var result = Regex.Replace(source, "([^\w\d_]|^)" r "([^\w\d_]|$)", "$1$2");
Вот мой тест Linqpad для второго регулярного выражения.
void Main()
{
Rep("CAIRN-CA-200", "CA").Dump();
Rep("CAIRN", "CA").Dump();
Rep("CAIRN CA 200", "CA").Dump();
Rep("CA 200", "CA").Dump();
Rep("CA", "CA").Dump();
Rep("CAIRN CA", "CA").Dump();
}
// Define other methods and classes here
string Rep(string s, string r)
{
return Regex.Replace(s, "([^\w\d_]|^)" r "([^\w\d_]|$)", "$1$2");
}
И результаты
CAIRN-CA-200 => CAIRN--200
CAIRN => CAIRN
CAIRN CA 200 => CAIRN 200
CA 200 => 200
CA =>
CAIRN CA => CAIRN