仅保留字符和数字的正则表达式

31

我想要从一个字符串中去除除了a-z、A-Z和0-9之外的所有字符,因此我需要为Java的string.replaceAll(regex, "");创建一个正则表达式。

原来的字符串看起来像这样:

MAX EUK_1334-PP/B+
新的字符串应该长成这样:
MAXEUK1334PPB
6个回答

82

可能有更简洁的正则表达式,但这个肯定可以工作:

string.replaceAll("[^a-zA-Z0-9]", "");

4
我不够快,用iPhone打字回答的时候。 - bw_üezi
9
如果您允许它匹配多个字符,那么使用string.replaceAll("[^a-zA-Z0-9]+", "")可能会更快。 - MRAB
尝试了字符串24\7。奇怪的是它返回了24。为什么? - sandy
3
你是否尝试过字符串字面值"24\7""24\\7"?前者包含字符24和ASCII码为7的响铃符。缺少反斜杠可能会解释你遇到的结果。 - stevevls
@sandy 那正是重点,斜杠是不允许的,那为什么要包含呢? - mjs
@momo 我相信他更关注的是数字7没有出现,而不是反斜杠没有出现。 - Admin Voter

19
string.replaceAll("[^a-zA-Z0-9]+", "");

1
正如@MRAB后来所提到的,我决定一次性替换多个字符以获得更好的性能。 - bw_üezi

2
String test = "MAX EUK_1334-PP/B+";     
test = test.replaceAll("[\\W_]", "");
System.out.println(test + "\n");

打印结果:

MAXEUK1334PPB

你知道吗,\W 也不匹配“_”字符吗? - Donal Fellows
这个正则表达式将包括所需的字符以及下划线。括号也是多余的。 - stevevls
这会导致出现 unexpected char: 'W'Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ ) - Dominik
修正了正则表达式并添加了更清晰的示例。 - aleroot

1

和 OP 几乎一模一样,我已经尝试使用 Ramda 进行了这个操作。

const filteredString = R.replace (/[^a-zA-Z0-9 "-/]/g, '');

去除所有字符以外的内容(加上:“- /)。奇怪的是,如果没有使用构造函数,这个正则表达式不会删除点(.)。其他所有功能都能正常工作。

因此,对于 OP 应该是

const filteredString = R.replace (/([^a-zA-Z0-9])|(_)/g, '');

或者使用 RegExp 构造函数

const onlyChars = new RegExp ('([^a-zA-z0-9])|(_)', 'g');
const filteredString = R.replace (onlyChars, '');

使用方法:

const oldString = `MAX EUK_1334-PP/B+`;
filteredString (oldString); -> "MAXEUK1334PPB"

更新:我的错误,第一次应该写错了,因为点实际上被删除了。这个正则表达式不会删除的字符是“_”,所以我添加了它。


1

有些人忘记了"_"字符:

String regex = "[_\\W]";

public class RegexFun2 {
   public static void main(String[] args) {
      String test = "MAX EUK_1334-PP/B+";

      String regex = "[_\\W]";

      String result = test.replaceAll(regex, "");
      System.out.println(result);
   }
}

但我仍然认为,如果OP没有首先尝试并在原始问题中发布他的尝试,那么他就在欺骗自己。这只是我的个人看法。


0

您可以使用字符的ASCII值:

while(!end of string){
    if(valueOfChar is between 48-57 or 65-90 or 97-122)
          write it to your string
}

这可能有所帮助,但我不知道你是否应该使用replaceAll编写代码。 replaceAll和这段代码都具有相同的性能(O(n))。


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