Помогите с манипулированием некоторыми строками - PullRequest
8 голосов
/ 20 мая 2010

Мои строки такого типа: City (PR) из базы данных, где PR обозначает провинцию.

В конце я хочу две отдельные переменные. Город и пиар.

Я должен сделать это с C #. Любая идея? Спасибо.

Ответы [ 8 ]

14 голосов
/ 20 мая 2010

Предположим, города не содержат ( символов:

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 - это подстрока от первого символа до, но не включая последний ( символ.
province - это подстрока от первого символа после последнего ( до конца, исключая последний символ.

14 голосов
/ 20 мая 2010

Вы можете использовать Regex и именованные группы.

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;
}

Regex объяснение

(?<City>[^(]*)\((?<PR>[^)]*)\):

  • (?<City>XXX) определяет группу с именем Город
    • [^(]* соответствует любому символу, который не является ( от 0 до неограниченного времени
  • \( соответствует ( один раз
  • (?<PR>XXX) определяет группу с именем PR
    • [^)]* соответствует любому символу, который не является ) от 0 до неограниченного времени
  • \) соответствует ) один раз
10 голосов
/ 20 мая 2010

Regex?

Вы можете разделить ваш шаблон на группы захвата и перейти оттуда.

(.*)(\(.*\))

Это захватит город в первой группе и ваш PR / провинцию во второй.

Редактировать: madgnomes регулярное выражение удаляет паратенезы из матча, даже если в этот момент регулярное выражение становится страшным:)

2 голосов
/ 20 мая 2010

У вас есть пара методов для string один из них 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];

Вы можете просто удалить парантез с помощью других строковых методов, если хотите.

Можно утверждать, что это не лучший способ сделать это. Это просто и дайте, что вы хотите, вы хотите. Как и предполагали другие, регулярные выражения, вероятно, являются «самым чистым» способом сделать это.

Примечание

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

1 голос
/ 20 мая 2010

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

Очевидно, что это не всегда возможно, поэтому, вероятно, вы задаете вопрос таким, какой вы есть, но тот факт, что вы получаете данные таким образом, подразумевает, что данные должны быть структурированы или получены по-другому ,

1 голос
/ 20 мая 2010

Есть ли шанс, что вы можете изменить дизайн БД, чтобы иметь другое поле для хранения, будь то провинция или штат? Это ужасный дизайн, и для того, чтобы обойти его, вам определенно нужно написать некрасивый код ... Что-то вроде

if(CityAndProvinceOrStateIndicator.Contains(" (PR)"))
{
   // This is a province.
   // Get the city name only
   string CityNameOnly = CityAndProvinceOrStateIndicator.Replace(" (PR)", "");


}
elseif...
1 голос
/ 20 мая 2010

Если провинция всегда в скобках, а название города не будет заключено в скобки, вы можете использовать функцию Split.

string foo = "City (PR)";
string[] bar = foo.Split('(');

Переменная bar будет содержать город в первом столбце массива и провинцию во втором (хотя вы захотите удалить правую скобку).

0 голосов
/ 20 мая 2010

Пусть следующий оператор 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

Вот набор данных, который я создал для тестирования:

Джоэл, 1 Software St, Нью-Йорк (Нью-Йорк), 12345
Джефф, 321 Ужас Лейн, Сан где-то (CAL), 90210
Zamboni, 888 Wpf Rd, Ванкувер (Британская Колумбия), V0S1A0
Билл, 7 Main St, Vista (Вашингтон), 77777

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...