Обработка строк с помощью регулярных выражений

#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 and PA и 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