programing

JSON 배열을 추출하는 정규 표현식

firstcheck 2022. 10. 28. 21:41
반응형

JSON 배열을 추출하는 정규 표현식

PCRE 정규 표현을 사용하여 JSON을 추출하려고 합니다.JSON 기능은 없지만 REGEX 기능은 있는 MariaDB 버전을 사용하고 있습니다.

내 문자열은:

{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush"],"carriers":[],"exclude_carriers":[]}

의 내용을 입수하고 싶다.category2개의 아이템으로 이루어진 매칭 그룹을 원합니다.Jebb그리고.Bush(또는 배열에 있는 항목의 수).

이 패턴을 시험해 봤는데 첫 번째 패턴과 일치합니다./(?<=category":\[).([^"]*).*?(?=\])/g

이것이 당신의 요구에 맞습니까?크기에 관계없이 카테고리 배열과 일치해야 합니다.

"category":(\[.*?\])

regex101의 예시

JSON은 정규 언어가 아닙니다.균형 잡힌 것을 임의로 삽입할 수 있기 때문에
딜리미터는 적어도 문맥이 없는 것이어야 합니다.

예를 들어 어레이 배열에 대해 생각해 보겠습니다.

[ [ [ 1, 2], [2, 3] ] , [ [ 3, 4], [ 4, 5] ] ]
확실히 당신은 그것을 진정한 정규 표현으로는 해석할 수 없습니다.
토픽:Javascript의 단일 키: 값을 해석하려면 정규식을 참조하십시오.Maybe Effect for you.

캡처되지 않은 그룹 집합을 사용하여 미리 정의된 json 어레이를 추출할 수 있습니다.

regex 응답: (?:\"category\":)(?:\[)(.*)(?:\"\])

그 표현 추출물"category":["Jebb","Bush"]따라서 첫 번째 그룹에 접속하여 어레이를 추출합니다.예: Java 코드:

Pattern pattern = Pattern.compile("(?:\"category\":)(?:\\[)(.*)(?:\"\\])");        
String body = "{\"device_types\":[\"smartphone\"],\"isps\":[\"a\",\"B\"],\"network_types\":[],\"countries\":[],\"category\":[\"Jebb\",\"Bush\"],\"carriers\":[],\"exclude_carriers\":[]}";
Matcher matcher = pattern.matcher(body);
assertThat(matcher.find(), is(true));
String[] categories = matcher.group(1).replaceAll("\"","").split(",");

assertThat(categories.length, is(2));
assertThat(categories[0], is("Jebb"));
assertThat(categories[1], is("Bush"));

여러 가지 방법이 있다.한 가지 허술한 방법은/([A-Z])\w+/g

콘솔에서 다음과 같이 시도해 보십시오.

var data = '{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush"],"carriers":[],"exclude_carriers":[]}',
     res = [];
data.match(/([A-Z])\w+/g); // ["Jebb", "Bush"]

위의 내용은 매우 엉성하지만 숫자에 관계없이 모든 요소를 하나씩 추출하고 배열(res)에 배치하는 견고한 단일 regex 솔루션은 다음과 같습니다.

var rex = /[",]+(\w*)(?=[",\w]*"],"carriers)/g,
    str = '{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush","Donald","Trump"],"carriers":[],"exclude_carriers":[]}',
    arr = [],
    res = [];
while ((arr = rex.exec(str)) !== null) {
  res.push(arr[1]); // <- ["Jebb", "Bush", "Donald", "Trump"]
}

http://regexr.com/3d4ee에서 확인하세요.

그래, 해보자.나는 기막힌 생각을 해냈다.만약 JS에 look-behind가 있다면, 이것은 단순히 look-forward를 사용한 앞의 예에서 적용된 논리를 뒤집는 것만으로 이루어질 수 있습니다.아아, 거기엔...그래서 나는 세상을 바꾸기로 결심했다.이것 좀 봐.

String.prototype.reverse = function(){
                             return this.split("").reverse().join("");
                           };
var rex = /[",]+(\w*)(?=[",\w]*"\[:"yrogetac)/g,
    str = '{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush","Donald","Trump"],"carriers":[],"exclude_carriers":[]}',
    rev = str.reverse();
    arr = [],
    res = [];
    while ((arr = rex.exec(rev)) !== null) {
      res.push(arr[1].reverse()); // <- ["Trump", "Donald", "Bush", "Jebb"]
    }
res.reverse(); // <- ["Jebb", "Bush", "Donald", "Trump"]

콘솔을 사용하여 확인하십시오.

c++에서는 이렇게 할 수 있습니다.

bool foundmatch = false;
try {
    std::regex re("\"([a-zA-Z]+)\"*.:*.\\[[^\\]\r\n]+\\]");
    foundmatch = std::regex_search(subject, re);
} catch (std::regex_error& e) {
    // Syntax error in the regular expression
}

어레이 내의 항목 수가 제한되어 있는 경우(및 관리 가능), 한정된 수의 옵션 항목으로 정의할 수 있습니다.다음과 같이 최대 5개의 항목이 있습니다.

"category":\["([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)")?)?)?)?

regex101의 예를 나타냅니다.

안부 전해요.

언급URL : https://stackoverflow.com/questions/36307861/regular-expression-to-extract-a-json-array

반응형