正则表达式匹配符号的最后一次出现

时间:2018-04-22 22:18:27

标签: php regex

我正在试图弄清楚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}

问题:如何更改正则表达式以实现目标?

1 个答案:

答案 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;
            }
        });
    }    
}

Live demo

故障:

  • 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]);

Live demo