【发布时间】:2013-05-23 03:10:13
【问题描述】:
我有String a="abcd1234",我想将其拆分为String b="abcd" 和Int c=1234。此拆分代码应适用于所有输入之王,例如 ab123456 和 acff432 等。如何拆分这种字符串。有可能吗?
【问题讨论】:
标签: java string split numbers number-formatting
我有String a="abcd1234",我想将其拆分为String b="abcd" 和Int c=1234。此拆分代码应适用于所有输入之王,例如 ab123456 和 acff432 等。如何拆分这种字符串。有可能吗?
【问题讨论】:
标签: java string split numbers number-formatting
您可以尝试使用像(?<=\D)(?=\d) 这样的正则表达式进行拆分。试试这个:
String str = "abcd1234";
String[] part = str.split("(?<=\\D)(?=\\d)");
System.out.println(part[0]);
System.out.println(part[1]);
会输出
abcd
1234
您可以使用Integer.parseInt(part[1]) 将数字字符串解析为整数。
【讨论】:
\D 匹配所有非数字字符,而\d 匹配所有数字字符。 ?<= 是正向后视(因此当前位置之前的所有内容都被断言为非数字字符),?= 是正向前瞻(因此当前位置之后的所有内容都被断言为数字)。这有帮助吗?
蛮力解决方案。
String a = "abcd1234";
int i;
for(i = 0; i < a.length(); i++){
char c = a.charAt(i);
if( '0' <= c && c <= '9' )
break;
}
String alphaPart = a.substring(0, i);
String numberPart = a.substring(i);
【讨论】:
使用正则表达式:
Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
Matcher m = p.matcher(string);
if (!m.find())
{
// handle bad string
}
String s = m.group(1);
int i = Integer.parseInt(m.group(2));
我还没有编译这个,但你应该明白了。
【讨论】:
你可以做下一个:
split("(?=\\d)(?<!\\d)")这样的正则表达式分割
【讨论】:
public static void main(String... s) throws Exception {
Pattern VALID_PATTERN = Pattern.compile("([A-Za-z])+|[0-9]*");
List<String> chunks = new ArrayList<String>();
Matcher matcher = VALID_PATTERN.matcher("ab1458");
while (matcher.find()) {
chunks.add( matcher.group() );
}
}
【讨论】:
([A-Z]|[a-z])+ 一样在 () 之后,并且字母也可以像 [a-zA-Z] 一样组合在一起。第一个问题是一个彻头彻尾的错误。第二个效果更好。
| 管道,在字母和数字之间进行 OR。您应该将此作为解决方案撤回或在正确测试后修复它。
使用正则表达式"[^A-Z0-9]+|(? 按字母和数字分割字符串。
例如
String str = "ABC123DEF456";
然后使用此正则表达式的输出将是:
ABC
123
DEF
456
【讨论】:
String st = "abcd1234";
String st1=st.replaceAll("[^A-Za-z]", "");
String st2=st.replaceAll("[^0-9]", "");
System.out.println("String b = "+st1);
System.out.println("Int c = "+st2);
输出
String b = abcd
Int c = 1234
【讨论】:
您可以在每组符号中添加一些分隔符⦀,然后围绕这些分隔符拆分字符串:
public static void main(String[] args) {
String[][] arr = {
split("abcd1234", "\u2980"),
split("ab123456", "\u2980"),
split("acff432", "\u2980")};
Arrays.stream(arr)
.map(Arrays::toString)
.forEach(System.out::println);
// [abcd, 1234]
// [ab, 123456]
// [acff, 432]
}
private static String[] split(String str, String delimiter) {
return str
// add delimiter characters
// to non-empty sequences
// of numeric characters
// and non-numeric characters
.replaceAll("(\\d+|\\D+)", "$1" + delimiter)
// split the string around
// delimiter characters
.split(delimiter, 0);
}
另见:How to split a string delimited on if substring can be casted as an int?
【讨论】:
试试这个:
String input_string = "asdf1234";
String string_output=input_string.replaceAll("[^A-Za-z]", "");
int number_output=Integer.parseInt(input_string.replaceAll("[^0-9]", ""));
System.out.println("string_output = "+string_output);
System.out.println("number_output = "+number_output);
【讨论】: