如何在Ballerina中进行正则匹配?现有方法异常求替代方案
Ballerina正则匹配问题解析与替代方法
先解释你的代码问题
你遇到的matches返回false但replaceAll成功的原因很明确:
string.matches()和regex:matches()方法要求整个字符串完全匹配正则表达式,而你的url3是/guest-wifi-accounts/{ownerEmail},显然不是只包含{ownerEmail},所以返回false。regex:replaceAll()只需要匹配字符串中的子串即可执行替换,所以能成功替换目标内容。
Ballerina中可用的正则匹配替代方法
1. 简单子串检查:string.contains()
如果只是判断目标字符串是否存在(不需要正则的特殊匹配逻辑),直接用这个最高效,无需正则:
string key = "ownerEmail"; string url3 = "/guest-wifi-accounts/{ownerEmail}"; io:println(url3.contains(string `{${key}}`)); // 输出true
2. 查找单个匹配:regex:find()
用于查找第一个匹配的子串,返回regex:Match?类型,可通过类型判断是否存在匹配:
regex:Match? match = regex:find(url3, string `\{${key}\}`); io:println(match is regex:Match); // 输出true // 若匹配成功,还能获取匹配的细节 if match is regex:Match { io:println("匹配到的内容: ", match.value); }
3. 查找所有匹配:regex:findAll()
获取所有符合正则的子串,返回regex:Match[]数组,可用于遍历或统计匹配次数:
regex:Match[] matches = regex:findAll(url3, string `\{${key}\}`); io:println("匹配次数: ", matches.length()); // 输出1 for regex:Match m in matches { io:println("匹配项: ", m.value); }
4. 子串位置查找:string.indexOf()
返回目标子串第一次出现的索引,不存在则返回-1,以此判断是否存在:
int pos = url3.indexOf(string `{${key}}`); io:println(pos != -1); // 输出true
5. 正则分割字符串:regex:split()
通过正则分割字符串,若分割后的数组长度大于1,说明存在匹配:
string[] parts = regex:split(url3, string `\{${key}\}`); io:println(parts.length() > 1); // 输出true io:println(parts); // 输出["/guest-wifi-accounts/", ""]
内容的提问来源于stack exchange,提问作者Mindula
相关产品推荐
相关产品推荐

