ASC가 아닌 경우문자열에서 II 문자를 삭제하시겠습니까?
나는 조건이 있다."A função"
,"Ãugent"
이런 캐릭터를 대체해야 합니다.ç
,ã
,그리고.Ã
빈 끈으로.
비 ASC를 제거하려면 어떻게 해야 하나요?내 줄에 있는 글자?
이하의 기능을 사용해 실장하려고 하고 있습니다만, 정상적으로 동작하지 않습니다.한 가지 문제는 불필요한 문자가 공백 문자로 대체되고 있다는 것입니다.
public static String matchAndReplaceNonEnglishChar(String tmpsrcdta) {
String newsrcdta = null;
char array[] = Arrays.stringToCharArray(tmpsrcdta);
if (array == null)
return newsrcdta;
for (int i = 0; i < array.length; i++) {
int nVal = (int) array[i];
boolean bISO =
// Is character ISO control
Character.isISOControl(array[i]);
boolean bIgnorable =
// Is Ignorable identifier
Character.isIdentifierIgnorable(array[i]);
// Remove tab and other unwanted characters..
if (nVal == 9 || bISO || bIgnorable)
array[i] = ' ';
else if (nVal > 255)
array[i] = ' ';
}
newsrcdta = Arrays.charArrayToString(array);
return newsrcdta;
}
ASCII 이외의 문자가 모두 검색되어 치환됩니다.
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
FailedDev의 답변은 양호하지만 개선할 수 있습니다.ASCII 어소시에이션을 보존하려면 , 우선 정규화할 필요가 있습니다.
String subjectString = "öäü";
subjectString = Normalizer.normalize(subjectString, Normalizer.Form.NFD);
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
=> will produce "oau"
이렇게 하면 "ööü"와 같은 문자가 "oau"에 매핑되어 최소한 일부 정보가 보존됩니다.정규화하지 않으면 결과 String은 공백이 됩니다.
이것은 Unicode 솔루션이 될 것입니다.
String s = "A função, Ãugent";
String r = s.replaceAll("\\P{InBasic_Latin}", "");
\p{InBasic_Latin}
는 Unicode 범위 U+0000의 모든 문자를 포함하는 Unicode 블록입니다.U+007F(regular-expression.info 참조)
\P{InBasic_Latin}
부정의\p{InBasic_Latin}
이런 걸 시도해 보세요.알파벳의 특수문자 범위는 192부터 시작되므로 결과적으로는 이러한 문자를 피할 수 있습니다.
String name = "A função";
StringBuilder result = new StringBuilder();
for(char val : name.toCharArray()) {
if(val < 192) result.append(val);
}
System.out.println("Result "+result.toString());
[업데이트된 솔루션]
를 "정규화"(표준 분해) 및 "모두 바꾸기"와 함께 사용하여 적절한 문자로 바꿀 수 있습니다.
import java.text.Normalizer;
import java.text.Normalizer.Form;
import java.util.regex.Pattern;
public final class NormalizeUtils {
public static String normalizeASCII(final String string) {
final String normalize = Normalizer.normalize(string, Form.NFD);
return Pattern.compile("\\p{InCombiningDiacriticalMarks}+")
.matcher(normalize)
.replaceAll("");
} ...
또는 아래 함수를 사용하여 문자열에서 ASCII가 아닌 문자를 제거할 수 있습니다.사내 근무에 대해 알게 될 것입니다.
private static String removeNonASCIIChar(String str) {
StringBuffer buff = new StringBuffer();
char chars[] = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (0 < chars[i] && chars[i] < 127) {
buff.append(chars[i]);
}
}
return buff.toString();
}
ASCII 테이블에는 128개의 코드가 포함되어 있으며, 인쇄 가능한 문자는 총 95자입니다.이 중 52자만이 문자입니다.
[0-127]
ASCII 코드[32-126]
인쇄 가능한 문자[48-57]
숫자[0-9]
[65-90]
대문자[A-Z]
[97-122]
소문자[a-z]
메서드를 사용하여 스트림을 가져올 수 있습니다.int
이 문자열의 문자 값 및 비 ASC 출력II 문자:
String str1 = "A função, Ãugent";
String str2 = str1.codePoints()
.filter(ch -> ch < 128)
.mapToObj(Character::toString)
.collect(Collectors.joining());
System.out.println(str2); // A funo, ugent
또는 문자 범위를 명시적으로 지정할 수도 있습니다.예를 들어, 문자를 제외한 모든 항목을 필터링합니다.
String str3 = str1.codePoints()
.filter(ch -> ch >= 'A' && ch <= 'Z'
|| ch >= 'a' && ch <= 'z')
.mapToObj(Character::toString)
.collect(Collectors.joining());
System.out.println(str3); // Afunougent
다음 항목도 참조하십시오.비밀번호 검증에서 특수문자를 사용하지 않는 방법(Regex 없음)
String s = "A função";
String stripped = s.replaceAll("\\P{ASCII}", "");
System.out.println(stripped); // Prints "A funo"
또는
private static final Pattern NON_ASCII_PATTERN = Pattern.compile("\\P{ASCII}");
public static String matchAndReplaceNonEnglishChar(String tmpsrcdta) {
return NON_ASCII_PATTERN.matcher(s).replaceAll("");
}
public static void main(String[] args) {
matchAndReplaceNonEnglishChar("A função"); // Prints "A funo"
}
설명.
이 메서드는 지정된 정규 표현(regex)의 모든 인스턴스를 지정된 대체 문자열로 바꿉니다.
지정된 정규 표현과 일치하는 이 문자열의 각 하위 문자열을 지정된 대체 문자열로 바꿉니다.
에는 Java가 ."\p{ASCII}"
의 문자와 및 그의 ASCII 문자"\P{ASCII}"
의 비 ASCASC와 「」는, 일치하는 할 수 있기 으로 문자열로부터 으로 삭제할 수 있습니다.일치하는 문자를 빈 문자열로 대체하여 결과 문자열에서 효과적으로 제거할 수 있습니다.
String s = "A função";
String stripped = s.replaceAll("\\P{ASCII}", "");
System.out.println(stripped); // Prints "A funo"
유효한 regex 구성체의 전체 목록은 클래스에 문서화되어 있습니다.
이 번 된 ": " " " " " " " " 을 이 더 입니다.Pattern
보다 직접String.replaceAll
되는 것이 한 만 컴파일되고 재사용됩니다.replaceAll
고고부부부부다다
public class AsciiStripper {
private static final Pattern NON_ASCII_PATTERN = Pattern.compile("\\P{ASCII}");
public static String stripNonAscii(String s) {
return NON_ASCII_PATTERN.matcher(s).replaceAll("");
}
}
읽기 쉽고 ASCII 인쇄가 가능한 스트림 솔루션:
String result = str.chars()
.filter(c -> isAsciiPrintable((char) c))
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining());
private static boolean isAsciiPrintable(char ch) {
return ch >= 32 && ch < 127;
}
"하려면: "_"로 변환하려면:.map(c -> isAsciiPrintable((char) c) ? c : '_')
에서 regex 32로, regex는 regex 32에서 입니다.[^\\x20-\\x7E]
(regex '는 regex '는 regex입니다)
is Ascii Printable 소스: http://www.java2s.com/Code/Java/Data-Type/ChecksifthestringcontainsonlyASCIIprintablecharacters.htm
CharMatcher.retainFrom
Google Guava 라이브러리를 사용하는 경우 를 사용할 수 있습니다.
String s = "A função";
String stripped = CharMatcher.ascii().retainFrom(s);
System.out.println(stripped); // Prints "A funo"
언급URL : https://stackoverflow.com/questions/8519669/how-can-non-ascii-characters-be-removed-from-a-string
'programing' 카테고리의 다른 글
PHP의 유형 조정 및 (엄격한) 크기/낮은 비교 (0) | 2022.10.29 |
---|---|
2차원 배열을 선언하려면 어떻게 해야 합니까? (0) | 2022.10.29 |
Javascript/jQuery에서 두 숫자 사이에 모든 정수 배열 생성 (0) | 2022.10.29 |
HTML 텍스트 오버플로 줄임표 검출 (0) | 2022.10.29 |
JSON 배열을 추출하는 정규 표현식 (0) | 2022.10.28 |