2014-09-13 2 views
-2

나는 Minecraft 용 Bukkit API 용 플러그인을 만들려고하고 있는데 문자열로이 문제를 겪고 있습니다. 문자열의 특정 부분을 제거 할 수 없었습니다. 대단히 감사하겠습니다.자바에서 문자열에서 특정 문자를 제거하는 방법

그래서 코드 줄을 사용할 때 문제가 발생합니다. iter.next(). toString();

의 입력 밖으로 코드 인쇄의 라인

"ItemStack {DIAMOND_SWORD X 1}"내가 문자열의 "X 1"부분을 제거하고 뭔가가있는 경우 그 후 나머지를 유지하는 것이 어떻게

?

  • 문자열
  • 그냥 }[space(s)]x[space(s)][digit(s)]}을 대체 할 같은
  • 분할
+0

시도한 것들을 어떻게 시도 했습니까? – BitNinja

+1

replace()의 문제점은 무엇입니까? – clicky

+0

http://www.regular-expressions.info/ 도움이 될만한 정보가있을 수 있습니다. – daboross

답변

1

것 같습니다 교체 : 여기

은 내가 시도 것들의 목록입니다. 그 경우라면 당신은
replaceAll("\\s+x\\s+\\d+\\}", "}"); 

replaceAll

는 첫 번째 인수로 regular expression (정규식)를 사용하여 시도 할 수 있습니다. 정규 표현식에서 \s ( "\\s"으로 작성)은 공백을 나타내며 +을 나타내며 이전에 설명한 요소의이 하나 이상 나타나므로 "\\s+"은 하나 이상의 공백을 나타냅니다. 이제 \d은 숫자 (범위의 문자 0-9)를 나타냅니다. 또한 {}은 특수 문자이므로 이스케이프 처리하려면 } 앞에 \\을 추가해야했습니다. 당신이 요구 사항을 변경 한 후


업데이트 :

replaceAll("ItemStack\\{(\\w+)\\s+x\\s+\\d+\\}", "{$1}"); 

\\w 범위 a-zA-Z0-9_의 모든 문자를 나타냅니다. 나는 \\w+을 괄호로 묶어 group을 저장하고 DIAMOND_SWORD을 저장할 것이므로 $[groupID]을 통해 교체 부품에서 일치를 사용할 수 있습니다. 이것이 우리의 첫 번째 그룹이기 때문에 그 수는 1 그래서 우리는 이것에 대해 생각 만 {DIAMOND_SWORD}

+0

예, 작동하지만 // s + x 등이 혼란스럽게 작동하는 방식을 설명 할 수 있습니까? –

+0

죄송합니다.하지만 DIAMOND_SWORD를 출력하는 데 필요할 수도 있습니다. –

+0

그런 경우'{$ 1}'이 아니라'$ 1'으로 대체하십시오. – Pshemo

0

으로 전체

ItemStack{DIAMOND_SWORD x 1} 

를 대체 할 대체에 {$1}를 사용할 수있다 :

당신이 iter.next 전화

() 반환 된 문자열을 변경하면 목록의 문자열에 대한 참조가 손실됩니다.

이것은 문자열의 동작과 관련이 있습니다. 문자열을 변경하면 새로운 문자열 개체에 대한 참조가됩니다.

목록 사용과 함께 사용하면 시도해야합니다.:

iter.set(iter.next().substring(int i)); 

이것은 당신이 괄호 안에 최초의 "단어"를 제외하고 모두 제거 할 가정 당신이 원하는 개체가 목록에 배치됩니다 관리 ...

+0

정수를 사용해야하는 것은 사용할 수 없습니다. –

+0

? ... 저는 여러분의 문제가 Iterator와 객체 참조의 잘못된 처리에있을 수 있음을 보여주고 싶었습니다. 내 진술은 단지 예일뿐입니다 (예 :!). 문제를 해결하는 정확한 코드는 다음과 같습니다. iter.set (iter.next(). substring (0, s.indexOf ("x 1")). concat ("}"))); – matthiasboesinger

0

를 취합니다

str = str.replaceAll("(\\{\\w+)[^}]+\\}","$1}");