【问题标题】:Searching Strings containing a regex in createCriteria Method在 createCriteria 方法中搜索包含正则表达式的字符串
【发布时间】:2021-05-27 08:49:05
【问题描述】:

我将 Grails 用于我的 Web 应用程序项目。我知道 createCriteria 方法可以对数据库中的现有条目执行搜索。假设我有一个域“some_domain”,其中包含一个字符串变量“domain_string”。我想找出所有包含以“1”或“7”开头的 7 位或 10 位数字的“domain_strings”。 (例如 domain_string1 = ".......1234567.......", domain_string2 = ".......7192839265......" 等等)

在我的代码中:

some_domain.createCriteria().list() {
   rlike("domain_string", "%/^(1|7){7,10}/%")
}

我在这里使用了 java 正则表达式,grails 文档告诉我 rlike 用于正则表达式输入。但是我无法通过代码获得确切的输出,因为我不熟悉 groovy 语法。对此有什么建议吗?提前非常感谢。

【问题讨论】:

  • 快速提醒,rlike 仅在使用 Oracle 或 MySQL 时支持。你没有指定,所以我猜你正在使用其中之一,但如果没有,这将不起作用。

标签: java regex grails groovy


【解决方案1】:

你可以使用

rlike("domain_string", /([^0-9]|^)[17][0-9]{6}([0-9]{3})?([^0-9]|$)/)

请参阅regex demo

详情

  • ([^0-9]|^) - 非数字字符或字符串开头
  • [17] - 17
  • [0-9]{6} - 任意六位数
  • ([0-9]{3})? - 三位数的可选出现
  • ([^0-9]|$) - 非数字字符或字符串结尾。

【讨论】:

  • @NiC 另一个变体:/(?<!\d)[17]\d{6}(\d{3})?(?!\d)/
【解决方案2】:

Java 原生规则的 Groovy 正则表达式如下所示:

def RE = /\D*[17]\d+\D*/

def domain_strings = [ ".........1234567.......", ".......7192839265......", ".......3192839265......", , ".......4192839265......" ]

domain_strings.each{
  boolean match = it ==~ RE
  println "$it matches? -> $match"
}

打印:

.........1234567....... matches? -> true
.......7192839265...... matches? -> true
.......3192839265...... matches? -> false
.......4192839265...... matches? -> false

您应该检查您的 DB SQL 方言是否可以按原样使用此类表达式。

【讨论】:

    猜你喜欢
    • 2019-09-25
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多