您好 我有这种字符串,我想获得 喜欢toto100成为toto 100 谢谢你的帮助
答案 0 :(得分:3)
搜索
(?<=[a-zA-Z])(?=[0-9])
并用空格替换它。如果您还想分割100toto
,请使用
(?<=[a-zA-Z])(?=[0-9])|(?<=[0-9])(?=[a-zA-Z])
这个正则表达式正在寻找一个位于字母后面和数字前面的位置。由于它不必匹配,保存和替换任何实际文本,而只是在两个字符之间的位置插入一个空格,这是非常快的。
正如tchrist所建议的那样,当然最好不要将自己局限于ASCII字母和数字,特别是如果您使用的语言在正则表达式中支持Unicode(如Java那样)。
所以第二个正则表达式看起来像
(?<=\p{L])(?=\p{N})|(?<=\p{N})(?=\p{L})
在Java中:
String result = subject.replaceAll("(?<=\\p{L])(?=\\p{N})|(?<=\\p{N})(?=\\p{L})", " ");
答案 1 :(得分:1)
借用Tim的解决方案但更正处理超过1970年代的ASCII - 请记住,Java字符是Unicode,所以你必须考虑到这一点 - 给出这个简单的解决方案:
String new = old.replaceAll("(?x) (?<= \\pL ) (?= \\pN ) | (?<= \\pN ) (?= \\pL )", " ");
这个更易维护,更少疯狂的版本:
String new = old.replaceAll(
"(?x) # enable comment mode \n"
+ " # LOOK FOR EITHER: \n"
+ " (?<= \\pL ) # a letter right behind \n"
+ " (?= \\pN ) # AND a number right ahead \n"
+ " | # OR ELSE \n"
+ " (?<= \\pN ) # a number right behind \n"
+ " (?= \\pL ) # AND a letter right ahead \n"
+ "", // placeholder so comma doesn't get lost
" "); // replaced with a single space
我猜你可以这样写,所以它不是那么缩进的:
String new = old.replaceAll(
"(?x) # enable comment mode \n"
+ " # LOOK FOR EITHER: \n"
+ " (?<= \\pL ) # a letter right behind \n"
+ " (?= \\pN ) # AND a number right ahead \n"
+ " | # OR ELSE \n"
+ " (?<= \\pN ) # a number right behind \n"
+ " (?= \\pL ) # AND a letter right ahead \n"
+ "", // placeholder so comma doesn't get lost
" "); // replaced with a single space
这可能是你能做的最好的,因为非常不合适 Java就是这种工作。如果你只使用过Java,你可能甚至都不知道它到底有多糟糕。相比之下,在实际设计的语言中,相同的操作看起来与正则表达式相同:
($new = $old) =~ s{ # LOOK FOR EITHER:
(?<= \pL ) # a letter right behind
(?= \pN ) # AND a number right ahead
| # OR ELSE:
(?<= \pN ) # a number right behind
(?= \pL ) # AND a letter right ahead
}{ }xg; # THEN insert a single space
查看所有许多的重要差异?简直令人咋舌,不是吗?
如果我愿意,我可以在汇编程序中进行正则表达式工作;事实上,我有。它真的和Java一样有趣。用Java做正则表达式就像教猪一样唱歌:这是浪费你的时间,它会使猪烦恼;它也会使包括你在内的所有人烦恼。
学习使用正确的工具来完成正确的任务是专业程序员与代码猴的区别。生命太短暂,无法击败砖墙。
答案 2 :(得分:0)
由于你没有指定语言,这里有一个Ruby:
ruby-1.9.2-p0 > "toto123".gsub(/([a-z]+)(\d+)/i, '\1 \2')
=> "toto 123"
但在其他语言中,它非常相似。