JSON 배열을 추출하는 정규 표현식
PCRE 정규 표현을 사용하여 JSON을 추출하려고 합니다.JSON 기능은 없지만 REGEX 기능은 있는 MariaDB 버전을 사용하고 있습니다.
내 문자열은:
{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush"],"carriers":[],"exclude_carriers":[]}
의 내용을 입수하고 싶다.category
2개의 아이템으로 이루어진 매칭 그룹을 원합니다.Jebb
그리고.Bush
(또는 배열에 있는 항목의 수).
이 패턴을 시험해 봤는데 첫 번째 패턴과 일치합니다./(?<=category":\[).([^"]*).*?(?=\])/g
이것이 당신의 요구에 맞습니까?크기에 관계없이 카테고리 배열과 일치해야 합니다.
"category":(\[.*?\])
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
'programing' 카테고리의 다른 글
Javascript/jQuery에서 두 숫자 사이에 모든 정수 배열 생성 (0) | 2022.10.29 |
---|---|
HTML 텍스트 오버플로 줄임표 검출 (0) | 2022.10.29 |
변수에서 JS 개체 속성 이름을 설정하는 방법 (0) | 2022.10.28 |
Chrome 디버깅 - 다음 클릭 시 중단 이벤트 (0) | 2022.10.28 |
XML을 해석하고 특정 노드 속성의 인스턴스를 가져오려면 어떻게 해야 합니까? (0) | 2022.10.28 |