【问题标题】:How would one trim all non-alphanumeric and numeric characters from the beginning and end of a string?如何从字符串的开头和结尾修剪所有非字母数字和数字字符?
【发布时间】:2013-06-18 14:22:30
【问题描述】:

编辑:我更改了标题以具体反映我正在尝试做的事情。

有没有办法在 .NET 中检索当前文化的所有字母数字(或者最好只是字母)字符?我的情况是我有几个字符串需要从中删除所有数字和非字母字符,我不太确定如何在尊重英语以外的语言字母表的同时实现这一点(没有创建所有.NET 支持的所有语言的字母字符,或者至少是我们当前客户的语言(哈哈)

更新:

具体来说,我要做的是修剪从字符串开头到第一个字母字符,然后从最后一个字母字符到字符串结尾的所有非字母字符。因此,对于 en-US 中的一个随机示例,我想转:

()&*1@^#47*^#21%Littering aaaannnnd(*&^1#*32%#**)7(#9&^

如下:

Littering aaaannnnd

这对于英语来说很简单,因为它是我的第一语言,但实际上在任何文化中我都需要能够从字符串中删除数字和其他非字母数字字符。

【问题讨论】:

  • 您能否展示一些不同字符串的示例,您需要从中删除非 Alpha 字符,也许您可​​以尝试其他一些替代方法。
  • 我会用一个例子来更新问题
  • 我更新了我的问题以具体解决我想要完成的任务,所以请不要将其标记为重复。

标签: c# .net string .net-4.0 cultureinfo


【解决方案1】:
   string something = "()&*1@^#47*^#21%Littering aaaannnndóú(*&^1#*32%#**)7(#9&^";
   string somethingNew = Regex.Replace(something, @"[^\p{L}-\s]+", "");

这是你要找的吗?

编辑:添加以允许其他语言字符。这将输出 Littering aaaannnndóú

【讨论】:

  • 刚刚注意到你前后说了些什么。此示例还将删除其间的所有非法字符。因此,如果 Littering aaaannnnd 是 Li@34tterin 98#45 aaaann$45)nnd 它仍然会出现 Littering aaaannnnd...不确定这是否适合您。
  • 他说他想要一个适用于所有文化的解决方案,而不仅仅是美式英语。所以想象一下,他希望西里尔字符在俄罗斯文化中可以使用,在法语中使用法语字符等等。
  • 感谢 Shlomo,我已更新我的答案以接受其他语言字符。
  • \p{L} 或 \p{Letter}:来自任何语言的任何类型的字母。 \s:空格。将其放入 [^...] 意味着它将匹配 ... 区域中的任何内容
  • 这是不正确的。这也将从字符串中间删除非字母和数字字符。 OP 在问题的标题和正文中都明确指出,它应该只从字符串的开头和结尾删除这些字符。
【解决方案2】:

使用正则表达式方法,应该可以解决:

string input = "()&*1@^#47*^#21%Littering aaaannnnd(*&^1#*32%#**)7(#9&^";
string result = Regex.Replace(input, "(?:^[^a-zA-Z]*|[^a-zA-Z]*$)", ""); //TRIM FROM START & END

【讨论】:

  • 见上面@Shlomo 的评论,美式英语不是我需要为之工作的唯一文化。
  • @AlexanderMiles 检查我上面的答案。我已将它更新到我希望它对你有用的地方。
  • 这也将从中间修剪,这不是 OP 的意图。
【解决方案3】:

不使用正则表达式: 在 Java 中,你可以这样做:

while (true) {
    if (word.length() == 0) {
        return ""; // bad
    }

    if (!Character.isLetter(word.charAt(0))) {
        word = word.substring(1);
        continue; // so we are doing front first
    }
    if (!Character.isLetter(word.charAt(word.length()-1))) {
        word = word.substring(0, word.length()-1);
        continue; // then we are doing end
    }
    break; // if front is done, and end is done
}

如果你用的是别的东西,那么java,用Character.isLetter替换是很简单的,只要搜索字符编码,你就会找到字母字符的整数值,你可以用它来做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2014-05-04
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多