帮助操作一些字符串

时间:2010-05-20 14:04:03

标签: c# string

我的字符串属于这种类型:来自数据库的City (PR),其中PR代表省。

最后我想要两个独立的变量。城市和公关。

我必须用C#做这件事。任何的想法?感谢。

8 个答案:

答案 0 :(得分:14)

假设城市不包含(个字符:

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是从最后一个(到最后一个字符之后的第一个字符的子字符串。

答案 1 :(得分:14)

您可以使用正则表达式和命名组。

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

正则表达式解释

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

  • (?<City>XXX)定义了一个名为City的组
    • [^(]*匹配任何非(的字符,介于0和无限次之间
  • \(一次匹配(
  • (?<PR>XXX)定义了一个名为PR的组
    • [^)]*匹配任何非)的字符,介于0和无限次之间
  • \)一次匹配)

答案 2 :(得分:10)

正则表达式?

您可以将模式划分为capture groups并从那里开始。

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

这将捕获第一组中的城市和第二组中的PR /省份。

编辑:madgnomes正则表达式从匹配中移除了paratheneses,即使正则表达式在这一点上变得可怕:)

答案 3 :(得分:2)

您在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];

如果您愿意,可以使用其他字符串方法删除paranthesis。

有人可能会说这不是最好的方法。这很简单,给你想要的。正如其他人所说,正则表达式可能是“最干净”的方式。

注意

如果您想支持名称中包含空格的城市,此方法对您来说效果不佳。然后我会建议发布其他答案之一。

答案 4 :(得分:1)

如果省总是在括号中,并且城市名称没有任何括号,则可以使用拆分功能。

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

bar变量将使城市位于数组的第一列,而省位则位于第二列(尽管您需要删除右括号)。

答案 5 :(得分:1)

您是否有机会修改数据库设计以使其具有不同的字段来保存它是省还是州?这是一个可怕的设计,为了解决它你肯定需要写一些丑陋的代码......有些东西是

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


}
elseif...

答案 6 :(得分:1)

虽然已经提到了很好的解析选项,但我只是建议您考虑转到源并修改数据库查询,甚至可能修改数据库本身。

显然这并不总是可能的,这可能就是你以问题的方式提出问题的原因,但是你以这种方式接收数据这一事实意味着数据需要以不同的方式构建或获得。

答案 7 :(得分:0)

让以下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
Jeff,321 Horror Lane,San somewhere(CAL),90210
Zamboni,888 Wpf Rd,温哥华(Britsh Columbia),V0S1A0
比尔,7 Main St,Vista(WA),77777