정규 표현을 사용한 Java 값 추출
대략적인 형식의 문자열이 몇 개 있습니다.
[some text] [some number] [some more text]
Java Regex 클래스를 사용하여 [일부 번호]의 텍스트를 추출합니다.
어떤 정규 표현을 사용하고 싶은지 대략 알고 있습니다(다만, 어떠한 제안도 환영합니다).제가 정말 관심 있는 것은 정규식 문자열을 소스 데이터에 사용하여 [몇 가지 숫자]의 값을 생성하는 Java 호출입니다.
편집: 저는 하나의 [몇 가지 숫자]에만 관심이 있다는 것을 덧붙여야 합니다(기본적으로 첫 번째 인스턴스).소스 문자열이 짧기 때문에 [일부 숫자]가 여러 번 발생하는 것을 바라지 않습니다.
완전한 예:
private static final Pattern p = Pattern.compile("^([a-zA-Z]+)([0-9]+)(.*)");
public static void main(String[] args) {
// create matcher for pattern p and given string
Matcher m = p.matcher("Testing123Testing");
// if an occurrence if a pattern was found in a given string...
if (m.find()) {
// ...then you can use group() methods.
System.out.println(m.group(0)); // whole matched expression
System.out.println(m.group(1)); // first expression from round brackets (Testing)
System.out.println(m.group(2)); // second one (123)
System.out.println(m.group(3)); // third one (Testing)
}
}
첫 번째 번호를 찾고 있기 때문에 다음과 같은 regexp를 사용할 수 있습니다.
^\D+(\d+).*
그리고.m.group(1)
첫 번째 번호가 반환됩니다.서명된 숫자에는 마이너스 기호를 포함할 수 있습니다.
^\D+(-?\d+).*
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex1 {
public static void main(String[]args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("hello1234goodboy789very2345");
while(m.find()) {
System.out.println(m.group());
}
}
}
출력:
1234
789
2345
Allain은 기본적으로 Java 코드를 가지고 있기 때문에 그것을 사용할 수 있습니다.단, 숫자 앞에 단어 문자열만 있는 경우에만 그의 식이 일치합니다.
"(\\d+)"
는 첫 번째 자리 문자열을 찾을 수 있어야 합니다.선두의 자리수가 되는 것이 확실한 경우는, 선두의 자리수를 지정할 필요는 없습니다.마찬가지로, 그것을 원하지 않는 한, 그 뒤의 것을 지정할 필요가 없습니다.숫자만 원하는 경우 1자리 이상의 첫 번째 문자열로 지정하면 됩니다.
공백으로 오프셋될 것으로 예상할 경우 다음과 같이 지정할 수 있습니다.
"\\s+(\\d+)\\s+"
더 나을 수도 있어요
세 가지 부품이 모두 필요한 경우 다음과 같이 하십시오.
"(\\D+)(\\d+)(.*)"
편집 Allain과 Jack이 제공한 식에서는 숫자를 캡처하려면 숫자가 아닌 하위 집합을 지정해야 합니다.만약 당신이 regex 엔진에 당신이 찾고 있는 것을 말한다면\d
숫자 앞에 있는 모든 것을 무시합니다.J 또는 A의 식이 패턴에 맞는 경우 전체 일치가 입력 문자열과 동일합니다.그리고 그것을 명시할 이유가 없습니다.완전히 무시당하지 않는다면 클린매치를 늦출 수 있습니다.
Java String 클래스에는 Pattern 이외에도 정규 표현으로 동작할 수 있는 메서드가 몇 가지 있습니다.이 경우 코드는 다음과 같습니다.
"ab123abc".replaceFirst("\\D*(\\d*).*", "$1")
서 ''는\\D
는 숫자가 아닌 문자입니다.
Java 1.4 이상:
String input = "...";
Matcher matcher = Pattern.compile("[^0-9]+([0-9]+)[^0-9]+").matcher(input);
if (matcher.find()) {
String someNumberStr = matcher.group(1);
// if you need this to be an int:
int someNumberInt = Integer.parseInt(someNumberStr);
}
이 함수는 문자열에서 일치하는 모든 시퀀스를 수집합니다.이 예에서는 문자열에서 모든 전자 메일 주소를 가져옵니다.
static final String EMAIL_PATTERN = "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})";
public List<String> getAllEmails(String message) {
List<String> result = null;
Matcher matcher = Pattern.compile(EMAIL_PATTERN).matcher(message);
if (matcher.find()) {
result = new ArrayList<String>();
result.add(matcher.group());
while (matcher.find()) {
result.add(matcher.group());
}
}
return result;
}
★★★의 message = "adf@gmail.com, <another@osiem.osiem>>>> lalala@aaa.pl"
3월 3일
다음과 같은 작업을 수행해 보십시오.
Pattern p = Pattern.compile("^.+(\\d+).+");
Matcher m = p.matcher("Testing123Testing");
if (m.find()) {
System.out.println(m.group(1));
}
심플한 솔루션
// Regexplanation:
// ^ beginning of line
// \\D+ 1+ non-digit characters
// (\\d+) 1+ digit characters in a capture group
// .* 0+ any character
String regexStr = "^\\D+(\\d+).*";
// Compile the regex String into a Pattern
Pattern p = Pattern.compile(regexStr);
// Create a matcher with the input String
Matcher m = p.matcher(inputStr);
// If we find a match
if (m.find()) {
// Get the String from the first capture group
String someDigits = m.group(1);
// ...do something with someDigits
}
Util 클래스의 솔루션
public class MyUtil {
private static Pattern pattern = Pattern.compile("^\\D+(\\d+).*");
private static Matcher matcher = pattern.matcher("");
// Assumptions: inputStr is a non-null String
public static String extractFirstNumber(String inputStr){
// Reset the matcher with a new input String
matcher.reset(inputStr);
// Check if there's a match
if(matcher.find()){
// Return the number (in the first capture group)
return matcher.group(1);
}else{
// Return some default value, if there is no match
return null;
}
}
}
...
// Use the util function and print out the result
String firstNum = MyUtil.extractFirstNumber("Testing4234Things");
System.out.println(firstNum);
StringTokenizer를 사용하여 할 수 있습니다.
String str = "as:"+123+"as:"+234+"as:"+345;
StringTokenizer st = new StringTokenizer(str,"as:");
while(st.hasMoreTokens())
{
String k = st.nextToken(); // you will get first numeric data i.e 123
int kk = Integer.parseInt(k);
System.out.println("k string token in integer " + kk);
String k1 = st.nextToken(); // you will get second numeric data i.e 234
int kk1 = Integer.parseInt(k1);
System.out.println("new string k1 token in integer :" + kk1);
String k2 = st.nextToken(); // you will get third numeric data i.e 345
int kk2 = Integer.parseInt(k2);
System.out.println("k2 string token is in integer : " + kk2);
}
이러한 수치 데이터를 3개의 다른 변수로 변환하기 때문에 이 데이터를 코드의 어느 곳에서나 사용할 수 있습니다(추가 사용을 위해).
는 요?[^\\d]*([0-9]+[\\s]*[.,]{0,1}[\\s]*[0-9]*).*
나는 그것이 소수 파트로 숫자를 처리해 줄 것이라고 생각한다.과 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★,
을 사용법사용자가 실수하여 숫자를 입력할 때 공백이 포함될 수 있다는 점을 고려하여 플로트를 포함한 문자열에서 숫자를 추출하려고 합니다.
javajava.lang에서 사용 가능한 할 수 있습니다.★★★★★★★★★★★★★★★★:
String input = "first,second,third";
//To retrieve 'first'
input.split(",")[0]
//second
input.split(",")[1]
//third
input.split(",")[2]
파일로부터 읽고 있는 경우는, 이것은 도움이 됩니다.
try{
InputStream inputStream = (InputStream) mnpMainBean.getUploadedBulk().getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String line;
//Ref:03
while ((line = br.readLine()) != null) {
if (line.matches("[A-Z],\\d,(\\d*,){2}(\\s*\\d*\\|\\d*:)+")) {
String[] splitRecord = line.split(",");
//do something
}
else{
br.close();
//error
return;
}
}
br.close();
}
}
catch (IOException ioExpception){
logger.logDebug("Exception " + ioExpception.getStackTrace());
}
Pattern p = Pattern.compile("(\\D+)(\\d+)(.*)");
Matcher m = p.matcher("this is your number:1234 thank you");
if (m.find()) {
String someNumberStr = m.group(2);
int someNumberInt = Integer.parseInt(someNumberStr);
}
언급URL : https://stackoverflow.com/questions/237061/using-regular-expressions-to-extract-a-value-in-java
'programing' 카테고리의 다른 글
컴포넌트 내부의 단일 지점에서 vuejs 오류를 캡처하는 방법 (0) | 2022.07.28 |
---|---|
이렇게 하면 메모리를 해방시킬 수 있을까요? (0) | 2022.07.28 |
Vue.js: 자 컴포넌트 상태에 따라 부모 컴포넌트 버튼 비활성화 (0) | 2022.07.26 |
문자열 배열을 ArrayList로 변환 (0) | 2022.07.26 |
사용 시기: Java 8+ 인터페이스 기본 방식과 추상 방식 비교 (0) | 2022.07.26 |