当前位置: 首页 > 知识库问答 >
问题:

从字符串中提取字符串某些部分的正确正则表达式是什么

沈博延
2023-03-14
    String query = "Select Count(distinct c.requestId)  FROM Abc1Value c  WHERE 1=1 and c.templateName is NULL "
            +" AND (c.quickStatus IS NULL OR c.quickStatus = 'S') "
            + " AND (c.sCode='MYCODE'  OR exists (SELECT b.dseaReqId FROM drstSShareValue b WHERE b.dseaReqId=c.requestId and b.sCode='MYCODE'))  "
            + " AND  (upper(c.licenseNo) like '%"12548"%' or upper(c.docLicenseNo) like '%""%' or upper(c.uncontrolledLicense) like '%""%' or upper(c.nonAuthNo) like '%""%' or upper(c.reAuthNo) like '%""%') "
            + " and  upper(c.grantedByCtryCode) like '%US%' ";

我想提取所有“like string”,即。

  1. 像“%”12548“%”
  2. 例如“%”
  3. 例如“%”
  4. 例如“%”
  5. 例如“%”

我在java(?I)(\\s)中使用正则表达式,如(\\s)*('%\'')(.?)(\“%”)当我获取组时,它不会返回正确的结果。请建议。

共有3个答案

柳涵映
2023-03-14

要获得所需的匹配,您还可以使用不带任何捕获组的匹配,并在'%"之后匹配零个或多个字符

(?i)(?<!\S)like\s*'%".*?"%'

正则表达式演示| Java演示

在爪哇

String regex = "(?i)(?<!\\S)like\\s*'%\".*?\"%'";
傅元龙
2023-03-14
(?i)(\\s)+like(\\s)*('%\")(.*?)(\"%')

...*?=零次或多次

西门马鲁
2023-03-14

你可以使用正则表达式,(?i)like\s'%.*?%'这意味着:

  • (?i)以不区分大小写的方式匹配模式的其余部分,例如,它允许匹配以下所有单词:likelikelike等。
  • \s匹配空格字符一次或多次。
  • .*?匹配懒惰,任何字符任意次数。

演示:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String query = """
                Select Count(distinct c.requestId)  FROM Abc1Value c  WHERE 1=1 and c.templateName is NULL
                 AND (c.quickStatus IS NULL OR c.quickStatus = 'S')
                 AND (c.sCode='MYCODE'  OR exists (SELECT b.dseaReqId FROM drstSShareValue b WHERE b.dseaReqId=c.requestId and b.sCode='MYCODE'))
                 AND  (upper(c.licenseNo) like '%"12548"%' or upper(c.docLicenseNo) like '%""%' or upper(c.uncontrolledLicense) like '%""%' or upper(c.nonAuthNo) like '%""%' or upper(c.reAuthNo) like '%""%')
                 AND  upper(c.grantedByCtryCode) like '%US%'
                """;
        Matcher matcher = Pattern.compile("(?i)like\\s+'%.*?%'").matcher(query);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

输出:

like '%"12548"%'
like '%""%'
like '%""%'
like '%""%'
like '%""%'
like '%US%'

附加演示:请在regex101上查看。

注意:为了保持query的外观整洁,我使用了作为JavaSE15一部分标准化的文本块(或多行字符串)特性。然而,这是没有必要的,你可以写它的方式,你张贴在你的问题。

 类似资料:
  • 我试图从一个大字符串中提取几个值,我很难提取它们,我厌倦了一些正则表达式模式,但它们总是给我不匹配的结果。无论如何,它们似乎在可用的在线正则表达式站点中有效,但在Scala中无效。我想做的是 输入: ESStor \磁盘 提取[输出]: 供应商名称 MO_May_MS_5.0 08765J54U3K4QVR0 我试图从输入字符串中提取这三个值,但无法做到。 有人能让我看看我做错了什么吗? 提前谢谢

  • 我有一个包含数千行的文本文件。这里有一个例子 我试图提取'nt60'、'nt50'末尾的字符串。 问题是会包含行尾字符() 我想使用正则表达式搜索来匹配从 (') 开始的字符串,但我不知道我应该用什么来匹配 。 有人能帮忙吗?

  • 问题内容: 我需要从此字符串中提取日期: BB通知:在04/10的11:28购买您的壁虱,最终卡号xxxx,$ 00,00。如果您不认识,请致电40032 2412。 也是整个日期04/04/2015 日期格式为dd / MM或dd / MM / yyyy 代码: String mydata =“ BB告知:在04/10的11:28,购买您的tickect,最终卡号xxxx,$ 00,00。如果您

  • 问题内容: 我有这串 并且我需要提取这3个子字符串 1234 06:30 07:45 如果我使用此正则表达式\\ d {2} \:\\ d {2}我只能提取第一个小时的06:30 matcher.group(1)引发异常。 另外我也不知道如何提取1234。此字符串可以更改,但总是在’XX〜’之后 。您对如何将这些字符串与正则表达式匹配有任何想法吗? 更新 多亏了亚当的建议,我现在有了这个正则表达式

  • 我想使用Gson将字符串转换为Foo对象: 下面是我的正则表达式: 如何使用此正则表达式将所有,.和替换为,,而不更改JSON中的键和值?

  • 我有一根下面这样的弦 现在我希望我的程序验证我的输入是否与字符串“phone”的模式相同 我做了以下工作 没奏效。我也尝试了其他的组合。什么都不起作用。 问题:1。我怎样才能做到这一点,而不使用‘模式’像上面?2.如何用图案做到这一点。我尝试了如下模式 Pattern Pattern=Pattern.compile(“(\d+)”);Matcher match=pattern.Matcher(电话