Мои строки являются этим видом: City (PR)
от Базы данных, где PR обозначает Область.
В конце я хочу две отдельных переменные. Город и PR.
Я должен сделать это с C#. Какая-либо идея?Спасибо.
Если провинция всегда находится в круглых скобках, а название города не будет иметь скобок, можно использовать функцию Split.
string foo = "City (PR)";
string[] bar = foo.Split('(');
В переменной bar город будет находиться в первом столбце массива, а провинция - во втором (хотя правую скобку нужно будет убрать).
Есть ли шанс, что вы можете изменить дизайн БД, чтобы иметь другое поле для хранения, будь то провинция или штат? Это ужасный дизайн, и чтобы обойти его, вам определенно нужно написать какой-то уродливый код ... Что-то вроде
if(CityAndProvinceOrStateIndicator.Contains(" (PR)"))
{
// This is a province.
// Get the city name only
string CityNameOnly = CityAndProvinceOrStateIndicator.Replace(" (PR)", "");
}
elseif...
Вы можете использовать регулярное выражение и именованные группы.
string resultString = "New York (New York)";
Regex regexObj = new Regex(@"(?<City>[^(]*)\((?<PR>[^)]*)\)",RegexOptions.IgnoreCase);
var match = regexObj.Match(subjectString);
if (match.Success)
{
string city = match.Groups["City"].Value.Trim();
string province = match.Groups["PR"].Value;
}
(?
:
(? XXX)
определяет группу с именем City
[^ (] *
соответствует любому символу, который не является (
от 0 до неограниченное количество раз \ (
соответствует (
один раз (? XXX)
определяет группу с именем PR
[^)] *
соответствует любому символу, не являющемуся )
от 0 до неограниченное количество раз \)
соответствует )
один раз Хотя были упомянуты отличные варианты синтаксического анализа, Я просто хотел бы предложить вам рассмотреть возможность перехода к источнику и изменения запроса к базе данных и, возможно, даже самой базы данных.
Очевидно, что это не всегда возможно, и, вероятно, поэтому вы задаете вопрос так, как вы есть, но тот факт, что вы получаете данные таким образом, подразумевает для меня, что данные должны быть структурированы или получены по-другому. .
Предполагается, что города не содержат символов (
:
string s = "City (PR)";
int p = s.LastIndexOf("(");
string city = s.Substring(0, p).Trim();
string province = s.Substring(p + 1, s.Length - p - 2).Trim();
city
- это подстрока от первого символа до последнего, но не включая последний (
символ.
область
- это подстрока от первого символа после последнего (
до конца, исключая последний символ.
Регулярное выражение?
Вы можете разделить свой шаблон на группы захвата и перейти оттуда.
(.*)(\(.*\))
Это захватит город в первой группе и вашу PR / провинцию во второй.
Редактировать: madgnomes регулярное выражение удаляет паратены из совпадения, даже если регулярное выражение становится пугающим в этот момент :)
Пусть следующий оператор SQL SELECT сделает всю работу за вас:
SELECT [Name], [Address],
LTRIM(RTRIM(LEFT([CityProv],CHARINDEX('(',[CityProv])-1))) as City,
LTRIM(RTRIM(SUBSTRING( [CityProv],
CHARINDEX('(',[CityProv]) + 1,
CHARINDEX(')',[CityProv]) - CHARINDEX('(',[CityProv]) - 1))) as Prov,
[PostalCode]
FROM Stackoverflow
Вот набор данных, который я создал для тестирования:
Joel, 1 Software St, NewYork (NY), 12345
Джефф, переулок ужасов 321, где-то в Сан (CAL), 90210
Замбони, 888 Wpf Rd, Ванкувер (Британская Колумбия), V0S1A0
Билл, 7 Мэйн Стрит, Виста (Вашингтон), 77777
У вас есть несколько методов для строк
один из них Split.
Пример
var s = "City (PR)";
var words = s.Split(' ');
foreach (string word in words)
{
Console.WriteLine(word);
}
Это выведет:
Город
(PR)
Вы также можете сделать это так
var words = s.Split(' ');
var city = words[0];
var pr = words[1];
Вы можете просто удалить парантезу с помощью других строковых методов, если хотите.
Можно возразить, что это не самый лучший способ. Он прост и дает вам то, что вы хотите. Как советовали другие, regex, вероятно, самый "чистый" способ сделать это.
Примечание
Если вы хотите поддерживать города с пробелами в названии, этот метод не будет работать так хорошо для вас. Тогда я бы предложил один из других ответов.