首页 > 解决方案 > 如何检查正则表达式以正则表达式开头和结尾

问题描述

如果字符串在双引号之间并且不是以/.

但是我想要的正则表达式解决方案。

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/"]。

标签: javaregex

解决方案


据我了解,您想在双引号之间捕获文本,除了:

  • 如果以[为前缀的初始双引号或以]为后缀的最终双引号
  • 以/为前缀的双引号不应是匹配文本的开头或结尾

我不知道您是否还想在单引号之间捕获文本,因为您的文本并不完全清楚。

要创建一个与前缀字符负匹配的非捕获组,您需要一组类型为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);
    }
}

推荐阅读