java - 如何检查正则表达式以正则表达式开头和结尾
问题描述
如果字符串在双引号之间并且不是以/
.
但是我想要的正则表达式解决方案。
The regex should not capture
条件 1. 在两个双引号或单引号之间捕获文本。条件 2. 但它不应该捕获 if 以 [ 开头并以 ] 结尾 条件 3. 但它不应该以 /" 开头并以 /' 结尾或以 /" 开头并以 /' 结尾
例子:
正则表达式:\"(\/?.)*?\"
输入:Functions.getJsonPath(Functions.getJsonPath(Functions.getJsonPath(Functions.unescapeJson("test"), "m2m:cin.as"),"payloads_ul.test"),"[/"Dimming Value/"]",input["test"]["in"])
输出:
captured output:
1. "test"
2. "m2m:cin.as"
3. "payloads_ul.test"
4. [/"Dimming Value/"]
5. "test"
6. "in"
预期结果:
1. "test"
2. "m2m:cin.as"
3. "payloads_ul.test"
4. [/"Dimming Value/"]
条件1说明:捕获双引号或单引号之间的文本。示例:输入:"test","m2m:cin.as"
输出:“测试”,“m2m:cin.as”
条件 2 解释:如果正则表达式介于开头[
和结尾之间,]
但它有双引号或单引号,那么它也不应该捕获。
示例:输入:["test"]
输出:它不应该捕获
条件 3 解释:在输入的上述预期结果中,"[/"Dimming Value/"]"
有一个两次双引号,但只捕获了一个,不包括/"
. 所以,输出是[/"Dimming Value/"]
。像这样,我想要 if /'
( single quote preceded by /
)。
注意:对于 input "[/"Dimming Value/"]" or '[/'Dimming Value/']'
,这里虽然文本介于双引号和单引号之间,[
但]
它不应该忽略字符串。输出应该是 [/"Dimming Value/"]。
解决方案
据我了解,您想在双引号之间捕获文本,除了:
- 如果以[为前缀的初始双引号或以]为后缀的最终双引号
- 以/为前缀的双引号不应是匹配文本的开头或结尾
我不知道您是否还想在单引号之间捕获文本,因为您的文本并不完全清楚。
要创建一个与前缀字符负匹配的非捕获组,您需要一组类型为Negative Lookbehind的组,其语法为(?<!prefix that you dont want),但这在 java 或 javascript 正则表达式引擎上不存在。
我为返回您想要的示例而构建的最佳正则表达式(但仅适用于 PHP 或 python(您可以在网站regex101.com或类似网站上查看))是:
(?<![\[/])\"(?!\])(\/?.)*?\"(?![\]/])
我添加了如果初始双引号后缀为]则不匹配的限制,以防止在文本["test"]["in"]上匹配"]["
无论如何,这不会解决您的问题,因为在 java 或 javascript 引擎中不起作用!
您有什么方法可以处理结果并排除错误的匹配项吗?
如果是这样,您可以匹配错误的前缀和错误的后缀并将其从结果中排除:
[\[]?\"(\/?.)*?\"[\]]?
这将返回:
"test"
"m2m:cin.as"
"payloads_ul.test"
"[/"Dimming Value/"]"
["test"]
["in"]
完整的 javascript 代码,包括 pos 处理:
'Functions.getJsonPath(Functions.getJsonPath(Functions.getJsonPath(Functions.unescapeJson("test"), "m2m:cin.as"),"payloads_ul.test"),"[/"Dimming Value/"]",input["test"]["in"])'
.match(/[\[]?\"(\/?.)*?\"[\]]?/g).filter(s => !s.startsWith('[') && !s.endsWith(']'))
这将返回:
"test"
"m2m:cin.as"
"payloads_ul.test"
"[/"Dimming Value/"]"
编辑:等效的java代码:
CharSequence yourStringHere = "Functions.getJsonPath(Functions.getJsonPath(Functions.getJsonPath(Functions.unescapeJson(\"test\"), \"m2m:cin.as\"),\"payloads_ul.test\"),\"[/\"Dimming Value/\"]\",input[\"test\"][\"in\"])";
Matcher m = Pattern.compile("[\\[]?\\\"(\\/?.)*?\\\"[\\]]?")
.matcher(yourStringHere);
while (m.find()) {
String s = m.group();
if (!s.startsWith("[") && !s.endsWith("]")) {
allMatches.add(s);
}
}
推荐阅读
- node.js - Smee-server 自托管 - 将 HTTP 重定向到 HTTPS
- azure - Azure Devops 中的缓存
- android - 如何创建半透明过滤器悬停活动?
- facebook - 是否可以使用图形 api 从 facebook 组获取销售帖子
- node.js - 如何修复 XMLHttpRequest 已被 CORS 策略阻止
- c# - 如果 ClassInitialize 或 TestInitalize 失败,您如何中止运行测试用例?
- c# - 如果过滤器值为空,Entity Framework Core 返回所有数据
- python - 当我尝试对简单的化学反应进行敏感性分析时,SALib 返回错误
- c# - 如何从目录符号链接中获取文件
- python - PyInstaller 无法使用 geopandas 和 fiona 创建 exe。即使我在 .spec 文件中进行了一些更改,exe 也无法正常工作