如何在Dart中仅从字符串中删除符号

46
我想从字符串中删除所有特殊符号,只保留单词。我尝试过这个方法,但输出结果没有变化。
main() {
    String s = "Hello, world! i am 'foo'";
    print(s.replaceAll(new RegExp('\W+'),'')); 
}

输出: Hello, world! i am 'foo'
期望: Hello world i am foo

5个回答

55

有两个问题:

  • '\W' 不是一个有效的转义序列,如果要在常规字符串字面量中定义反斜杠,需要使用\\或使用一个原始字符串字面量(r'...'
  • \W 正则表达式模式匹配任何不是单词字符的字符,包括空格。您需要使用否定字符类来替代,其中包括单词和空格类,例如 [^\w\s]

使用:

void main() {
  String s = "Hello, world! i am 'foo'";
  print(s.replaceAll(new RegExp(r'[^\w\s]+'),''));
}

输出:Hello world i am foo

完全支持Unicode的解决方案

基于什么是JavaScript正则表达式中匹配所有脚本中的非单词字符的正确范围?的帖子,并记住在Unicode感知的正则表达式中\w等同于[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}],您可以在Dart中使用以下内容:

void main() {
  String s = "Hęllo, wórld! i am 'foo'";
  String regex = r'[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}\s]+';
  print(s.replaceAll(RegExp(regex, unicode: true),''));
}
// => Hęllo wórld i am foo

1
我已经完成了工作,并且额外添加了 .replaceall("_","") 在末尾。 - Rajesh
4
@RajeshJr. 您可以将其合并为一个正则表达式: .replaceAll(new RegExp(r'(?:_|[^\w\s])+', '') - Wiktor Stribiżew
简单但它也将替换非英语“LETTERS”。 - Ehab Reda
1
@EhabReda 更新了一个全 Unicode 意识的解决方案。 - Wiktor Stribiżew
如何去除换行符?当代码进一步编码时,我得到的是"%0D%0A"。 - Sarah K
1
@SarahK 这些与\s匹配。如果你只想保留普通空格(\x20),那么只需将\s替换为一个普通空格,即[^\w ]+ - Wiktor Stribiżew

21
我发现这个问题是在寻找如何从字符串中删除符号。对于其他想要做到这一点的人来说,请参考以下内容:
final myString = 'abc=';
final withoutEquals = myString.replaceAll(RegExp('='), ''); // abc

在数字字符串“32.151”中,将“.”替换为“”时,我得到了不良结果。 - alireza easazade
5
这是因为 . 这个字符在正则表达式中意味着匹配任何一个单字符。所以,在你的例子中,每一个字符都会被匹配和替换掉。如果你只想匹配字面上的 . 点号,那么你需要转义它,可以写成 RegExp('\\.')RegExp(r'\.') 或者 RegExp('[.]') - Suragch

21

RegExp类的文档指出,如果您以这种方式构建正则表达式,应该使用原始字符串(以r为前缀的字符串字面值,例如r"Hello world")。这在使用转义时尤其必要。

此外,您的正则表达式还会捕获空格,因此您需要进行修改。您可以使用RegExp(r"[^\s\w]")代替-这将匹配任何不是空格或单词字符的字符。


谢谢,那个方法确实有效,但它也删除了空格,请问如何保留空格? - ketiwu

8

从字符串中删除字符“,”:

String myString = "s, t, r";
myString = myString.replaceAll(",", ""); // myString is "s t r"

7

第一种解决方案

s.replaceAll(RegExp(",|!|'"), "");    // The | operator works as OR

第二种解决方案

s.replaceAll(",", "").replaceAll("!", "").replaceAll("'", "");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接