我输入了包含数字的字符串,实现了myAtoi。我的程序正在检查所有情况,但在+-1
上失败。
我正在尝试通过以下方式进行检查:
if(str.matches("^[+-]|[-+]*"))
System.out.println("check="+str);
但是它不起作用。我只想对正则表达式有一些了解,以便一起检查+-
。
答案 0 :(得分:0)
也许您正在寻找这样的东西
/**
* Method to extract the first number from a String
* Will return either a double or long depending on whether the number contains decimal digits
*/
public Number extractNumber(String str) throws java.text.ParseException{
// Check if the input-String contains any digit:
if(!str.matches(".*\\d.*"))
// If not, return 0
return 0;
// Extract the first number:
String extractedNr = str.replaceAll(".*?([-+]*\\d+(\\.\\d*)?).*", "$1");
// Replace any "-+" or "+-" with just "-",
extractedNr = extractedNr.replace("-+", "-").replace("+-", "-")
// And remove any "--" since they neutralize each other
.replace("--", "");
// Convert the extracted number to a Double
// TODO: Try-catch the ParseException
double decResult = Double.parseDouble(extractedNr);
// If the extracted number does NOT contain decimal digits:
if(decResult % 1 == 0){
// Return the result as long
return (long)decResult;
} else{
// If it does contain decimal digits, just return it as double instead
return decResult;
}
}
正则表达式str.replaceAll(".*?([-+]*\\d+(\\.\\d*)?).*", "$1")
的其他说明:
.*?
:零个或多个随机前导字符,其后的部分由于?
(
:打开捕获组[-+]*
:零次或多次“-”和“ +”号\\d+
:后跟一位或多位数字(\\.\\d*)?
:后跟带有零个或多个数字的可选点)
:关闭捕获组.*
具有零个或多个随机结尾字符$1
:仅离开捕获的组,删除第一个提取的数字之前和之后的字符输出:
"42" → 42
"-42" → -42
"4193 with words" → 4193
"words and 987" → 987
"91283472332" → 91283472332
"3.145677" → 3.145677
"-91283472332" → -91283472332
"+1" → 1
"-+1" → -1
"something-something and -44.2" → -44.2
"55 and 11" → 55
"0000000012345678" → 12345678
"--9" → 9
"+-+-+---+---+-+015.0500" → -15.05
答案 1 :(得分:0)
常规表达式中,需要转义以下字符:
+*?^$\.[]{}()|/
如果您只是转换了以下内容:
if (str.matches("^[+-]|[-+]*")) System.out.println("check="+str);
对此-我认为这更有意义:
if (str.matches("^(\\+-|-\\+)*")) System.out.println("check="+str);
答案 2 :(得分:0)
这就是问题陈述 该函数首先丢弃必要的空白字符,直到找到第一个非空白字符。然后,从该字符开始,取一个可选的初始正负号,后跟尽可能多的数字,并将其解释为数值。
字符串可以在组成整数的字符之后包含其他字符,这些字符将被忽略,并且不会影响此函数的行为。
如果str中的非空格字符的第一个序列不是有效的整数,或者由于str为空或仅包含空格字符而没有这样的序列,则不执行任何转换。
如果无法执行有效的转换,则返回零值。
注意:
仅空格字符''被视为空白字符。 假设我们正在处理一个只能存储32位有符号整数范围内的整数的环境:[−231,231 − 1]。如果数值超出可表示值的范围,则返回INT_MAX(231-1)或INT_MIN(-231)。
这是我的解决方案,通过了1000多次测试并被接受,但是效果并不理想。可以用字符比较对列表进行排序是一个更好的主意吗?
public class Main {
public static int myAtoi(String str) {
if(str == null)
return 0;
str = str.trim();
if(str.matches(".*[A-Za-z0-9].*")){
String [] tokens = str.split("\\s+");
String s = tokens[0];
if(s.matches("[a-z]*\\D*")|| s.startsWith(".") ||s.matches("[+-]?[a-z]+\\d+") || s.matches("^[-+][+-][0-9]*"))
return 0;
if(s.matches("[+-]*[0-9a-z]*"))
s = s.split("[a-z]")[0];
if (s.matches("[+-]?([0-9]\\.?\\d*)")){
if(s.length() > 9){
Double num = Double.valueOf(s);
if(num > Double.valueOf(Integer.MAX_VALUE))
return Integer.MAX_VALUE;
if(num < Double.valueOf(Integer.MIN_VALUE))
return Integer.MIN_VALUE;
}
}
if(s.matches("[1-9]*[.][0-9]*")){
s = s.split("\\.",2)[0];
}if(s.matches("([-+]?[0-9]+[-+]+[0-9]+)")){
s=s.split("([-+][0-9]$)")[0];
}if(s.matches("^[-+][+-][0-9]*") ){
s = s.substring(2);
}if(s.matches("[-+]?(\\d+[-+]+)")){
s = s.split("[-+]+$")[0];
}if(s.matches("^[+][0-9]*")){
s = s.substring(1);
}
if(s.endsWith("-") ||s.endsWith("+"))
s=s.substring(0,s.length()-1);
if(s.endsWith("-+") ||s.endsWith("+-"))
s=s.substring(0,s.length()-2);
return Integer.valueOf(s);
}
return 0;
}
public static void main(String[] args) {
System.out.println("Hello World!");
String s1 = "42";
String s2 = " -42";
String s3 = "4193 with words";
String s4 = "words and 987";
String s5 = "91283472332";
String s6 = "3.145677";
String s7 = "-91283472332";
String s8 = "+1";
String s9 = "-+1";
String s10=" 0000000000012345678";
String s11=" -0012a42";
String s12="- 234";
String s13="-5-";
String s14=".1";
String s15="+-2";
String s16="0-1";
String s17="-1";
String s18="-13+8";
String s19="21474836++";
String s20=" +b12102370352";
System.out.println("returned="+ myAtoi(s20));
}
}