给出以下输入:
Invoice Date: {InvoiceDate(dd.mm.YYYY)}
Inoice Number: {InvoiceNumber}
我正在尝试提取
我让this regex为发票日期工作:
\{([^}]+)\(([^)]+)\)\}
但是很明显,(dd.mm.YYYY)
不是可选的。
然后我尝试了this regex:
\{([^}]+)(?:\(([^)]+)\))?\}
使用(?:)?
语法似乎忽略了我的内部捕获组(dd.mm.YYYY)
那么如何让\(([^)]+)\)
可选?
答案 0 :(得分:2)
你需要使第一个捕获组变得懒惰:
^(
请参阅demo here。
或者,使用\{([^(]+)(?:\(([^)]+)\))?\}
^
限制第一个捕获组中的字符,使其仅匹配括号:
<script>
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "https://connect.facebook.com/en_US/messenger.Extensions.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'Messenger'));
window.extAsyncInit = function () {
var isSupported = MessengerExtensions.isInExtension();
alert(isSupported);
// the Messenger Extensions JS SDK is done loading
MessengerExtensions.getContext('YOU_APP_ID',
function success(result){
alert("Success: "+result.psid);
},
function error(result){
alert(JSON.stringify(result));
}
);
};
</script>
答案 1 :(得分:1)
我从头开始打字工作,然后我不得不并排比较,看看我们的答案有什么区别:
/\{([^}(]+)(?:\(([^)]+)\))?\}/ // my answer
/\{([^}]+)(?:\(([^)]+)\))?\}/ // your answer
您可以看到我指定您的第一个捕获组不包括打开的圆括号。你们本来会捕获第一组中的整个字符串Invoicedate(dd.mm.YYYY)
,第二组没有任何内容。
这里是link。
答案 2 :(得分:0)