-+ 1字符串正则表达式以检查字符串编号是否同时包含两个符号

时间:2018-10-17 08:15:04

标签: java regex string integer

我输入了包含数字的字符串,实现了myAtoi。我的程序正在检查所有情况,但在+-1上失败。

我正在尝试通过以下方式进行检查:

if(str.matches("^[+-]|[-+]*"))
    System.out.println("check="+str);

但是它不起作用。我只想对正则表达式有一些了解,以便一起检查+-

3 个答案:

答案 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:仅离开捕获的组,删除第一个提取的数字之前和之后的字符

Try it online.

输出:

"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));
    }
}