원하는 출력이 같은 문자열 정규식 사용하여 변환 제공되지 않는 이유 이해 FooBar
에 Foo_Bar
대신주는를 Foo_Bar_
. String.substring으로 뭔가를 할 수도 substring(0, string.length() - 2)
있고 마지막 문자를 대체 할 수도 있었지만 그런 시나리오에 대한 더 나은 해결책이 있다고 생각합니다.
다음은 코드입니다.
String regex = "([A-Z][a-z]+)";
String replacement = "$1_";
"CamelCaseToSomethingElse".replaceAll(regex, replacement);
/*
outputs: Camel_Case_To_Something_Else_
desired output: Camel_Case_To_Something_Else
*/
질문 : 원하는 출력을 얻을 수있는 깔끔한 방법을 찾고 계십니까?
답변
이 질문 과 CaseFormat
구아바에서보기
귀하의 경우에는 다음과 같습니다.
CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "SomeInput");
답변
소문자와 대문자를 두 그룹으로 묶으면 괜찮을 것입니다.
public class Main
{
public static void main(String args[])
{
String regex = "([a-z])([A-Z]+)";
String replacement = "$1_$2";
System.out.println("CamelCaseToSomethingElse"
.replaceAll(regex, replacement)
.toLowerCase());
}
}
답변
아래 코드 스 니펫을 사용할 수 있습니다.
String replaceAll = key.replaceAll("(.)(\\p{Upper})", "$1_$2").toLowerCase();
답변
RegEx를 제공 할 수 없습니다. 어쨌든 엄청나게 복잡 할 것입니다.
약어를 자동으로 인식하여이 기능을 사용해보십시오.
불행히도 Guava lib는 대문자 약어를 자동으로 감지하지 않으므로 “bigCAT”는 “BIG_C_A_T”로 변환됩니다.
/**
* Convert to UPPER_UNDERSCORE format detecting upper case acronyms
*/
private String upperUnderscoreWithAcronyms(String name) {
StringBuffer result = new StringBuffer();
boolean begin = true;
boolean lastUppercase = false;
for( int i=0; i < name.length(); i++ ) {
char ch = name.charAt(i);
if( Character.isUpperCase(ch) ) {
// is start?
if( begin ) {
result.append(ch);
} else {
if( lastUppercase ) {
// test if end of acronym
if( i+1<name.length() ) {
char next = name.charAt(i+1);
if( Character.isUpperCase(next) ) {
// acronym continues
result.append(ch);
} else {
// end of acronym
result.append('_').append(ch);
}
} else {
// acronym continues
result.append(ch);
}
} else {
// last was lowercase, insert _
result.append('_').append(ch);
}
}
lastUppercase=true;
} else {
result.append(Character.toUpperCase(ch));
lastUppercase=false;
}
begin=false;
}
return result.toString();
}
답변
단순히 행의 시작이 아닌 것으로 이전 문자와 일치하지 않는 이유는 무엇 $
입니까?
String text = "CamelCaseToSomethingElse";
System.out.println(text.replaceAll("([^_A-Z])([A-Z])", "$1_$2"));
이 버전은 이미 낙타 케이스에 넣어도 안전합니다.
답변
너비가 0 인 미리보기 어설 션을 추가합니다.
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
(?=X)
기타 문서를 읽으십시오 .
개인적으로 나는 실제로 문자열을 분할 한 다음 다시 결합했습니다. 올바르게 수행하면 더 빠를 수 있으며 정규식 마술보다 코드를 훨씬 쉽게 이해할 수 있습니다. 오해하지 마세요. 저는 정규 표현식을 좋아합니다. 그러나 이것은 정말 깔끔한 정규 표현식이 아니며이 변환 은 고전적인 정규 표현식 작업도 아닙니다. 결국 소문자도하고 싶습니까?
못생긴하지만 빠른 해킹 교체하는 것 (.)([A-Z]+)
으로 $1_$2
하고 이후 전체 문자열을 소문자 (당신이 직접 교체를 소문자 수 펄 스타일 extrended regexps ‘에를 할 수 없다면!). 그래도 저는 아래에서 위로 전환 한 다음 변형 한 다음 결합하는 것이 적절하고 가장 읽기 쉬운 방법으로 분할하는 것을 고려합니다.
답변
public class ReplaceFromCameltoSnake {
public static void main(String args[]){
String s1=" totalAmountWithoutDiscount";
String replaceString=s1.replaceAll("([A-Z]+)","\\_$1").toLowerCase();
System.out.println(replaceString);
}
}