在任何第一个数字之前拆分字符串

Posted

技术标签:

【中文标题】在任何第一个数字之前拆分字符串【英文标题】:Split string before any first number 【发布时间】:2017-06-02 19:22:29 【问题描述】:
string test = " Puerto Rico 123 " ;

我只想获得"Puerto Rico"。这个想法是,它可以是任何数字,而不是123。我怎样才能做到这一点?

【问题讨论】:

你能提供更多输入输出的例子吗?您似乎正在修剪空格,不清楚(或者可以说它是 broad)您使用哪种模式来获得结果。 Find index of number from a string in C#的可能重复 【参考方案1】:

如果数字只出现在字符串的末尾,则可以进行简单的修剪:

var result = "Puerto Rico 123".TrimEnd(" 1234567890".ToCharArray());

  string source ="Puerto Rico 123";
  char[] toBeRemoved = " 1234567890".ToCharArray(); <-- note the whitespace...
  string result = source.TrimEnd(toBeRemoved); <-- remove the chars at the end     of the source

【讨论】:

和我的回答一样 @Kees de Wit 您刚刚编辑了您的答案(顺便说一句,这是错误的)并复制了这个。你的目标是什么??? 我只是将 char 数组的 init 替换为您的方法。事实上,我们有相同的答案。 如果输入只有一个尾随数字(如问题中的"Puerto Rico 123"),这是一个最好的解决方案;但是,如果数字可以出现在 中间 的某处(例如"Puerto Rico 123 Alas!"),则它不起作用。这个问题是模糊的,这个解读是可能的 (+1),但是,请在你的回答中提及你的愿景。【参考方案2】:

您可以像这样使用Regex

Regex MyRegex = new Regex("[^a-z A-Z.]", RegexOptions.IgnoreCase);
string s = MyRegex.Replace(@" Puerto Rico 123 ", @"");
Console.WriteLine(s);

【讨论】:

【参考方案3】:

您可以按照建议使用正则表达式,但您也可以尝试使用这个:

var str = " Puerto Rico 123 ";
var firstDigit = str.FirstOrDefault(c => char.IsDigit(c));

if (firstDigit != default(char))

    var substring = str.Substring(0, str.IndexOf(firstDigit));

如果有,则返回字符串中第一个数字的值,如果字符串中没有数字,则返回“\0”。之后,我们检查第一个数字是否不是 '\0',如果是,我们将初始字符串的子字符串从开始直到第一次出现在字符串中。

【讨论】:

波多黎各部分有号码时会失败 @KeesdeWit 问题是,在任何第一个数字之前拆分字符串,这正是这样做的。不是吗? :) 不,那不是问题。这是“我只想获得“波多黎各”的问题。这个想法是,它可以是任何数字,而不是 123。我怎样才能做到这一点?您在第一个数字之前看到任何关于拆分的明确信息吗?【参考方案4】:

我建议使用 正则表达式,这在上下文中非常容易:从字符串的开头 ^ 获取所有非数字 [^0-9]* 字符:

string test = " Puerto Rico 123 ";

string result = Regex.Match(test, @"^[^0-9]*").Value;

Linq 是一个替代方案:

string result = string.Concat(test.TakeWhile(c => c < '0' || c > '9'));

如果您想修剪前导和尾随空格(并以"Puerto Rico" 作为答案,而不是" Puerto Rico "),只需添加.Trim(),例如:

string result = Regex.Match(test, @"^[^0-9]*").Value.Trim();

【讨论】:

您也可以在Value 上调用Trim 删除前导和尾随空格。 @Abion47:谢谢!我明白了:由于问题建议 "Puerto Rico" - 修剪过的字符串 - 作为答案,所以最终的 .Trim() 很可能是强制性的。 波多黎各部分有号码时会失败 @Kees de Wit:它不会失败;如果"Puerto 123 Rico" 结果"Puerto "预期的行为:“拆分字符串之前 任何第一个数字”。并且“任何第一个数字之前的字符串”是"Puerto ",而“第一个数字”是123 @Kees de Wit:在"Pu3rto Rico" 上,结果是"Pu",这是预期的行为【参考方案5】:

你可以用这样的正则表达式来做到这一点:

Match match = Regex.Match("Puerto Rico 123", @"^.*?(?=\d)");
string text = match.Value;

【讨论】:

以上是关于在任何第一个数字之前拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

拆分由任何非数字字符串分隔的数字

如何在第一个数字之后拆分街道地址?

根据出现的任何数字拆分字符串

熊猫:除非在点之前有数字或字符,否则在点上拆分

数字后的Java正则表达式拆分字符串[重复]

仅按 golang 中的第一个元素拆分字符串