Справка с управлением некоторыми строками

Мои строки являются этим видом: City (PR) от Базы данных, где PR обозначает Область.

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

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

8
задан Michael Haren 20 May 2010 в 14:04
поделиться

8 ответов

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

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

В переменной bar город будет находиться в первом столбце массива, а провинция - во втором (хотя правую скобку нужно будет убрать).

1
ответ дан 5 December 2019 в 04:42
поделиться

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

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


}
elseif...
1
ответ дан 5 December 2019 в 04:42
поделиться

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

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 до неограниченное количество раз
  • \) соответствует ) один раз
14
ответ дан 5 December 2019 в 04:42
поделиться

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

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

1
ответ дан 5 December 2019 в 04:42
поделиться

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

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

14
ответ дан 5 December 2019 в 04:42
поделиться

Регулярное выражение?

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

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

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

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

10
ответ дан 5 December 2019 в 04:42
поделиться

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

0
ответ дан 5 December 2019 в 04:42
поделиться

У вас есть несколько методов для строк один из них 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, вероятно, самый "чистый" способ сделать это.

Примечание

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

2
ответ дан 5 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: