결과 목록에 가변 너비 구분 기호를 포함하는 Java 정규식으로 문자열을 분할하는 방법

Bastiaan van den Berg

문자열을 인용 부호와 인용 부호가없는 부분으로 나누고 싶습니다. 여기서 이스케이프 된 인용 부호는 무시됩니다. 예를 들어, 다음 입력 :

String input = "Example with \"quoted \\\"test\\\" region\" embedded";

다음 목록이 표시되어야합니다.

String[] result = ["Example with", "\"quoted \\\"test\\\" region\"", "embedded"];

인용 영역을 분할하려면 (이스케이프 인용 부호를 무시하면서) 다음을 사용합니다.

public static final String QUOTE_PATTERN = "(?<!\\\\)\".*?(?<!\\\\)\"";

String input = "Example with \"quoted \\\"test\\\" region\" embedded";
String[] result = input.split(QUOTE_PATTERN);
System.out.println(Arrays.toString(result));

예상되는 출력을 제공합니다 [Example with , embedded]. 그러나이 목록에 구분 기호 (인용 된 영역)도 포함하고 싶습니다. (물론, Matcher를 사용하여 시작 중지 인덱스를 가져옴으로써이를 달성 할 수 있지만 여전히 많은 추가 코드가 필요합니다.)

콜론으로 구분 된 문자열을 콜론이 포함 된 목록으로 성공적으로 분할 할 수있는 lookahead 및 lookbehind를 사용하여 구분 기호를 포함하는 문자열을 분할하는 솔루션을 찾았습니다.

public static final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
public static final String COLON_PATTERN = String.format(WITH_DELIMITER, ":");

String colonTest = "Part0:Part1:Part2";
String[] parts = colonTest.split(COLON_PATTERN);

System.out.println(Arrays.toString(parts));

그러면 다음과 같은 출력이 제공 [Part0, :, Part1, :, Part2]됩니다..

그러나 다음과 같은 이유로 가변 길이를 가진 구분 기호에는 적용 할 수없는 것 같습니다.

public static final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
public static final String QUOTE_PATTERN = 
    String.format(WITH_DELIMITER, "(?<!\\\\)\".*?(?<!\\\\)\"");

String input = "Example with \"quoted \\\"test\\\" region\" embedded";
String[] result = input.split(QUOTE_PATTERN);
System.out.println(Arrays.toString(result));

다음 오류가 발생합니다.

Exception in thread "main" java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 23
((?<=(?<!\\)".*?(?<!\\)")|(?=(?<!\\)".*?(?<!\\)"))
                   ^

가변 너비 구분 기호에 비슷한 것이 가능한지 아는 사람이 있습니까?

감사!

Wiktor Stribiżew

문자열의 길이가 200 개 이하이기 때문에 Java 제한 너비 look-behind를 사용할 수 있습니다 . 즉, Java의 look-behind는 {0,200}수량자를 지원 합니다 (최소 및 최대 길이가 지정됨).

✽ Java는 일치하는 문자열의 길이가 미리 정의 된 범위 내에있는 한 lookbehind 내에서 수량자를 허용합니다. 예를 들어 (?<=cats?)는 3 자 또는 4 자의 문자열과 만 일치 할 수 있기 때문에 유효합니다. 마찬가지로 (?<=A{1,10})유효합니다.

따라서 다음 코드를 활용할 수 있습니다.

String.format(WITH_DELIMITER, "(?<!\\\\)\".{0,200}(?<!\\\\)\"");
                                           ^^^^^^^

IDEONE 데모 보기

   String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";
   String QUOTE_PATTERN = 
   String.format(WITH_DELIMITER, "(?<!\\\\)\".{0,200}(?<!\\\\)\"");

   String input = "Example with \"quoted \\\"test\\\" region\" embedded";
   String[] result = input.split(QUOTE_PATTERN);
   System.out.println(Arrays.toString(result));

산출:

[Example with , "quoted \"test\" region",  embedded]

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

문자 구분 기호를 기반으로 목록을 하위 목록으로 분할하는 동안 빈 하위 문자열을 건너 뛰는 방법

분류에서Dev

Java에서 구분 기호 '(' '{' '}') '로 문자열을 분할하는 방법

분류에서Dev

Java에서 구분 기호로 문자열을 구문 분석하는 방법

분류에서Dev

쉼표로 구분 된 문자열을 분할하지만 Java에서 쉼표가 포함 된 일부 단어를 제외하는 방법

분류에서Dev

Python : 추가 구분자를 값으로 포함하는 문자열을 분할하는 방법

분류에서Dev

문자열을 "#"로 분할하고 결과를 DataTable에 저장하는 방법

분류에서Dev

정규식 해당 구분자를 제거하고 별도의 방법으로 추가하지 않고 문자열을 분할하는 방법

분류에서Dev

jquery에서 여러 구분 기호로 문자열을 분할하는 방법

분류에서Dev

Java에서 정규식을 사용하여 첫 번째 문자를 구분 기호로 간주하여 두 값을 구분하는 방법

분류에서Dev

PHP : 구분 기호로 문자열을 분할하는 방법

분류에서Dev

Python을 사용하여 문자열 (여러 구분 기호 포함)에서 경로를 추출하는 방법

분류에서Dev

스플리터를 배열에 유지하면서 정규식으로 문자열을 분할하는 방법

분류에서Dev

목록에서 문자열을 분할하고 각 단어를 키워드 집합과 비교하는 방법

분류에서Dev

Java : 대소 문자를 구분하지 않고 끝 부분에 숫자가있는 문자열을 알파벳순으로 정렬하는 방법

분류에서Dev

형식 문자열에서 천 단위 구분 기호를 아포스트로피로 변경하는 방법

분류에서Dev

문자열을 분할하고 구분 기호를 새 결과 항목으로 유지

분류에서Dev

숫자를 잃지 않고 Java에서 정규식을 사용하여 문자열을 분할하는 방법

분류에서Dev

posgres에서 정규식으로 문자열을 분할하는 방법

분류에서Dev

여러 구분 기호로 문자열을 분할하는 방법은 각 구분 기호에서 한 번만 가능합니까? 파이썬

분류에서Dev

구분 기호로 문자열을 분할하고 정수로 변환하는 방법

분류에서Dev

그것은 처음에 탭과 같은 구분 기호를 포함 할 수있는 경우 비어 있지 않은 단어에 문자열을 분할하는 방법

분류에서Dev

정규식으로 특수 문자를 제외하기 위해 문자열을 구문 분석하는 방법

분류에서Dev

여러 구분 기호로 문자열을 분할 할 때 구분 기호를 제자리에 유지하는 방법은 무엇입니까?

분류에서Dev

결과와 같은 열을 구분 기호가있는 단일 문자열로 가져 오는 방법

분류에서Dev

문자열을 이전에 분할하는 정규식, 여러 구분 기호

분류에서Dev

루비에서 악센트 부호가있는 문자로 문자열을 분할하는 방법

분류에서Dev

정규식으로 바꾸기를 사용하여 Java 문자열의 시작 부분에 추가하는 방법은 무엇입니까?

분류에서Dev

정규식으로 바꾸기를 사용하여 Java 문자열의 시작 부분에 추가하는 방법은 무엇입니까?

분류에서Dev

Python에서 백 슬래시 문자로 이스케이프하지 않고 구분 기호로 정규 표현식을 사용하여 문자열 목록을 결합하는 방법

Related 관련 기사

  1. 1

    문자 구분 기호를 기반으로 목록을 하위 목록으로 분할하는 동안 빈 하위 문자열을 건너 뛰는 방법

  2. 2

    Java에서 구분 기호 '(' '{' '}') '로 문자열을 분할하는 방법

  3. 3

    Java에서 구분 기호로 문자열을 구문 분석하는 방법

  4. 4

    쉼표로 구분 된 문자열을 분할하지만 Java에서 쉼표가 포함 된 일부 단어를 제외하는 방법

  5. 5

    Python : 추가 구분자를 값으로 포함하는 문자열을 분할하는 방법

  6. 6

    문자열을 "#"로 분할하고 결과를 DataTable에 저장하는 방법

  7. 7

    정규식 해당 구분자를 제거하고 별도의 방법으로 추가하지 않고 문자열을 분할하는 방법

  8. 8

    jquery에서 여러 구분 기호로 문자열을 분할하는 방법

  9. 9

    Java에서 정규식을 사용하여 첫 번째 문자를 구분 기호로 간주하여 두 값을 구분하는 방법

  10. 10

    PHP : 구분 기호로 문자열을 분할하는 방법

  11. 11

    Python을 사용하여 문자열 (여러 구분 기호 포함)에서 경로를 추출하는 방법

  12. 12

    스플리터를 배열에 유지하면서 정규식으로 문자열을 분할하는 방법

  13. 13

    목록에서 문자열을 분할하고 각 단어를 키워드 집합과 비교하는 방법

  14. 14

    Java : 대소 문자를 구분하지 않고 끝 부분에 숫자가있는 문자열을 알파벳순으로 정렬하는 방법

  15. 15

    형식 문자열에서 천 단위 구분 기호를 아포스트로피로 변경하는 방법

  16. 16

    문자열을 분할하고 구분 기호를 새 결과 항목으로 유지

  17. 17

    숫자를 잃지 않고 Java에서 정규식을 사용하여 문자열을 분할하는 방법

  18. 18

    posgres에서 정규식으로 문자열을 분할하는 방법

  19. 19

    여러 구분 기호로 문자열을 분할하는 방법은 각 구분 기호에서 한 번만 가능합니까? 파이썬

  20. 20

    구분 기호로 문자열을 분할하고 정수로 변환하는 방법

  21. 21

    그것은 처음에 탭과 같은 구분 기호를 포함 할 수있는 경우 비어 있지 않은 단어에 문자열을 분할하는 방법

  22. 22

    정규식으로 특수 문자를 제외하기 위해 문자열을 구문 분석하는 방법

  23. 23

    여러 구분 기호로 문자열을 분할 할 때 구분 기호를 제자리에 유지하는 방법은 무엇입니까?

  24. 24

    결과와 같은 열을 구분 기호가있는 단일 문자열로 가져 오는 방법

  25. 25

    문자열을 이전에 분할하는 정규식, 여러 구분 기호

  26. 26

    루비에서 악센트 부호가있는 문자로 문자열을 분할하는 방법

  27. 27

    정규식으로 바꾸기를 사용하여 Java 문자열의 시작 부분에 추가하는 방법은 무엇입니까?

  28. 28

    정규식으로 바꾸기를 사용하여 Java 문자열의 시작 부분에 추가하는 방법은 무엇입니까?

  29. 29

    Python에서 백 슬래시 문자로 이스케이프하지 않고 구분 기호로 정규 표현식을 사용하여 문자열 목록을 결합하는 방법

뜨겁다태그

보관