it-source

문자열에서 숫자를 추출하여 int 배열을 얻는 방법은 무엇입니까?

criticalcode 2022. 10. 20. 21:15
반응형

문자열에서 숫자를 추출하여 int 배열을 얻는 방법은 무엇입니까?

String 변수(기본적으로 숫자가 지정되지 않은 영어 문장)가 있는데 모든 숫자를 정수 배열로 추출하고 싶습니다.정규 표현에 대한 빠른 해결책은 없을까 해서요.


Sean의 솔루션을 사용하여 약간 변경했습니다.

LinkedList<String> numbers = new LinkedList<String>();

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line); 
while (m.find()) {
   numbers.add(m.group());
}
Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There are more than -2 and less than 12 numbers here");
while (m.find()) {
  System.out.println(m.group());
}

...인쇄-2그리고.12.


-?는 선행 마이너스 기호와 일치합니다(옵션).\d는 숫자와 일치하며, 이 값을 입력해야 합니다.\~하듯이\\Java String으로 지정합니다.따라서 \d+는 1자리 이상의 숫자와 일치합니다.

사용하는 방법은?replaceAlljava.displaces를 클릭합니다.문자열 방식:

    String str = "qwerty-1qwerty-2 455 f0gfg 4";      
    str = str.replaceAll("[^-?0-9]+", " "); 
    System.out.println(Arrays.asList(str.trim().split(" ")));

출력:

[-1, -2, 455, 0, 4]

묘사

[^-?0-9]+
  • [그리고.]는 단일 일치 문자 세트를 구분합니다.즉, 임의의 순서로 한 번만 일치시킵니다.
  • ^집합의 선두에 사용되는 특수 식별자로, 구분된 집합에 존재하지 않는 모든 문자와 일치하도록 지정하는 데 사용됩니다.
  • +가능한 한 한 한 번에서 무제한으로, 필요에 따라 돌려드립니다.
  • -?문자 "-"와 "-" 중 하나?
  • 0-9"0"에서 "9" 사이의 문자
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(myString);
while (m.find()) {
    int n = Integer.parseInt(m.group());
    // append n to list
}
// convert list to array, etc

실제로는 [0-9]를 \d로 대체할 수 있지만 이중 백슬래시 이스케이프를 수반하기 때문에 읽기 어렵습니다.

  StringBuffer sBuffer = new StringBuffer();
  Pattern p = Pattern.compile("[0-9]+.[0-9]*|[0-9]*.[0-9]+|[0-9]+");
  Matcher m = p.matcher(str);
  while (m.find()) {
    sBuffer.append(m.group());
  }
  return sBuffer.toString();

소수점을 유지하는 숫자를 추출하기 위한 것입니다.

승인된 답변은 숫자를 감지하지만 형식화된 숫자(예: 2,000)나 소수(예: 4.8)는 감지하지 않습니다.-?\\d+(,\\d+)*?\\.?\\d+?:

Pattern p = Pattern.compile("-?\\d+(,\\d+)*?\\.?\\d+?");
List<String> numbers = new ArrayList<String>();
Matcher m = p.matcher("Government has distributed 4.8 million textbooks to 2,000 schools");
while (m.find()) {  
    numbers.add(m.group());
}   
System.out.println(numbers);

출력:[4.8, 2,000]

유리수의 경우는, 다음의 것을 사용합니다.(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))

Java 8을 사용하면 다음 작업을 수행할 수 있습니다.

String str = "There 0 are 1 some -2-34 -numbers 567 here 890 .";
int[] ints = Arrays.stream(str.replaceAll("-", " -").split("[^-\\d]+"))
                 .filter(s -> !s.matches("-?"))
                 .mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]

음수가 없으면 음수를 제거할 수 있습니다.replaceAll(및 사용)!s.isEmpty()filter)는, 다음과 같은 것을 적절히 분할하는 것 뿐입니다.2-34(이것은, regex 로도 처리할 수 있습니다).split하지만 상당히 복잡합니다.)

Arrays.stream변하다String[]로 변환합니다.

filter선두와 후행의 빈 스트링뿐만 아니라-그건 숫자의 일부가 아니에요

mapToInt(Integer::parseInt).toArray()parseInt각각에 대해서String을 주다int[].


또는 Java 9에는 Matcher.results 메서드가 있어 다음과 같은 작업을 수행할 수 있습니다.

Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There 0 are 1 some -2-34 -numbers 567 here 890 .");
int[] ints = m.results().map(MatchResults::group).mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]

현재 상태로는 이 두 가지 모두 단순히 결과를 반복하는 것에 비해 크게 개선되지 않습니다.Pattern/Matcher다른 답변에 나타나듯이 스트림을 사용하면 상당히 간소화된 보다 복잡한 조작으로 후속 작업을 수행할 경우에는 더 단순해야 합니다.

이것을 사용하여 모든 실수를 추출합니다.

public static ArrayList<Double> extractNumbersInOrder(String str){

    str+='a';
    double[] returnArray = new double[]{};

    ArrayList<Double> list = new ArrayList<Double>();
    String singleNum="";
    Boolean numStarted;
    for(char c:str.toCharArray()){

        if(isNumber(c)){
            singleNum+=c;

        } else {
            if(!singleNum.equals("")){  //number ended
                list.add(Double.valueOf(singleNum));
                System.out.println(singleNum);
                singleNum="";
            }
        }
    }

    return list;
}


public static boolean isNumber(char c){
    if(Character.isDigit(c)||c=='-'||c=='+'||c=='.'){
        return true;
    } else {
        return false;
    }
}

실수를 나타내는 분수와 그룹화 문자는 언어마다 다를 수 있습니다.같은 실수는 언어에 따라 매우 다른 방법으로 쓰여질 수 있다.

독일어로 200만이라는 숫자

2,000,000.00

그리고 영어로

2.000.000,00

언어에 구애받지 않는 방법으로 주어진 문자열에서 실수를 완전히 추출하는 방법:

public List<BigDecimal> extractDecimals(final String s, final char fraction, final char grouping) {
    List<BigDecimal> decimals = new ArrayList<BigDecimal>();
    //Remove grouping character for easier regexp extraction
    StringBuilder noGrouping = new StringBuilder();
    int i = 0;
    while(i >= 0 && i < s.length()) {
        char c = s.charAt(i);
        if(c == grouping) {
            int prev = i-1, next = i+1;
            boolean isValidGroupingChar =
                    prev >= 0 && Character.isDigit(s.charAt(prev)) &&
                    next < s.length() && Character.isDigit(s.charAt(next));                 
            if(!isValidGroupingChar)
                noGrouping.append(c);
            i++;
        } else {
            noGrouping.append(c);
            i++;
        }
    }
    //the '.' character has to be escaped in regular expressions
    String fractionRegex = fraction == POINT ? "\\." : String.valueOf(fraction);
    Pattern p = Pattern.compile("-?(\\d+" + fractionRegex + "\\d+|\\d+)");
    Matcher m = p.matcher(noGrouping);
    while (m.find()) {
        String match = m.group().replace(COMMA, POINT);
        decimals.add(new BigDecimal(match));
    }
    return decimals;
}

단어 안에 포함된 숫자(bar1이나 aa1bb 등)를 제외하려면 정규식 기반 응답에 단어 경계 \b를 추가합니다.예를 들어 다음과 같습니다.

Pattern p = Pattern.compile("\\b-?\\d+\\b");
Matcher m = p.matcher("9There 9are more9 th9an -2 and less than 12 numbers here9");
while (m.find()) {
  System.out.println(m.group());
}

디스플레이:

2
12

ASCII 값을 체크하여 String에서 번호를 추출할 것을 제안합니다.myname12345 로서 String입력한다고 가정합니다.숫자 12345 를 추출하려면 먼저 String 을 Character Array 로 변환한 후 다음 의사코드를 사용합니다.

    for(int i=0; i < CharacterArray.length; i++)
    {
        if( a[i] >=48 && a[i] <= 58)
            System.out.print(a[i]);
    }

숫자를 추출하면 배열에 추가합니다.

도움이 되었으면 좋겠다

나는 이 표현이 가장 간단하다는 것을 알았다.

String[] extractednums = msg.split("\\\\D++");
public static String extractNumberFromString(String number) {
    String num = number.replaceAll("[^0-9]+", " ");
    return num.replaceAll(" ", "");
}

문자열에서 숫자만 추출합니다.

언급URL : https://stackoverflow.com/questions/2367381/how-to-extract-numbers-from-a-string-and-get-an-array-of-ints

반응형