我正在试图弄清楚PHP正则表达式。
给定多行字符串:
var Data = {
'a': 1,
'b': '{"a":[{"b":{"id":1}}]}'
}
var Data = {
'a': 2,
'b': '{"a":[{"b":{"id":2}}]}'
};
// Some other text here that may have }; or }. Blahblah blah.
// };
// }
我需要来自上面字符串的以下两个匹配项:
Data = {
'a': 1,
'b': '{"a":[{"b":{"id":1}}]}'
}
Data = {
'a': 2,
'b': '{"a":[{"b":{"id":2}}]}'
}
我尝试过 Data\s?=\s?{[^}]+};?
,但它匹配:
Data = {
'a': 1,
'b': '{"a":[{"b":{"id":1}
Data = {
'a': 2,
'b': '{"a":[{"b":{"id":2}
问题:如何更改正则表达式以实现目标?
答案 0 :(得分:4)
首先,如果您不确定是否打开和关闭大括号(如果它们出现在相同的数字中),则通常的解决方案是:
private boolean mDeleteMode = false;
protected void yourMethod(View view...) {
mDelete = view.findViewById(R.id.Im_delete);
mDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: clicked Delete icon");
Toast.makeText(getActivity(),
"Click a marker to delete it",
Toast.LENGTH_SHORT).show();
mDeleteMode = true;
}
});
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if (mDeleteMode) {
mDeleteMode = false;
marker.remove();
return true;
}
return false;
}
});
}
}
故障:
Data\s*=\s{(?:[^:}]*:.*\R+)+}
将Data\s*=\s{
与Data={
开始非捕获组
(?:
将一行与以下换行符匹配[^:}]*:.*\R+
重复尽可能多的)+
匹配结束大括号PHP代码(Demo):
}
但是,除非只引用我的注释,否则您需要PCRE支持的子程序调用和递归:
preg_match_all('~Data\s*=\s{(?:[^:}]*:.*\R+)+}~', $str, $matches);
print_r($matches[0]);