【问题标题】:how to check regex starts and ends with regex如何检查正则表达式以正则表达式开头和结尾
【发布时间】:2020-05-07 22:51:05
【问题描述】:

如果字符串在双引号之间并且不是以/ 开头或结尾,我将使用正则表达式来捕获字符串。

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

The regex should not capture

条件 1. 捕获两个双引号或单引号之间的文本。 条件 2. 但如果以 [ 开头并以 ] 结尾,则不应捕获 条件 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/"]

条件一说明: 捕获双引号或单引号之间的文本。 例子: 输入:"test","m2m:cin.as" 输出:"test","m2m:cin.as"

条件2说明: 如果正则表达式介于以[ 开头和以] 结尾但它有双引号或单引号,那么它也不应该被捕获。

示例: 输入:["test"] 输出:它不应该捕获

条件3解释: 在输入"[/"Dimming Value/"]" 的上述预期结果中,有一个两次双引号,但只捕获了一个不包括/" 的双引号。所以,输出是[/"Dimming Value/"]。像这样,我想要/'(single quote preceded by /)。

注意: 对于输入"[/"Dimming Value/"]" or '[/'Dimming Value/']',这里虽然文本介于双引号和单引号之间并且具有[],但它不应忽略该字符串。输出应该是 [/"Dimming Value/"]。

【问题讨论】:

  • 你想要javascript还是java?
  • 请编辑您的问题,不清楚您的要求。
  • @WJS,我想要java中的解决方案,我已经编辑了。
  • @SebastianNielsen,感谢您的回复,我已经用解释更新了问题。如果这不能消除您的疑问,请告诉我。

标签: java regex


【解决方案1】:

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

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

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

要创建一个带有前缀字符负匹配的非捕获组,您需要一组 Negative Lookbehind 类型的组,语法为 (?,但这在 java 或 javascript 正则表达式引擎上不存在。

我为返回您想要的示例而构建的最佳正则表达式(但仅适用于 PHP 或 python(您可以在网站 regex101.com 或类似网站上查看它))是:

(?<![\[/])\"(?!\])(\/?.)*?\"(?![\]/])

我添加了不匹配的限制,如果初始双引号以 ] 为后缀,以防止在文本 ["test"] 上匹配 "][" [“在”]

无论如何,这不会解决您的问题,因为在 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多