如何在正则表达式中匹配Kotlin中双引号的字符串

时间:2018-09-17 04:31:11

标签: regex kotlin


我想找到双引号内的字符串。

text : <a href = "http://weqweqwewqewqeqwe">

expected : http://weqweqwewqewqeqwe

如何使用正则表达式获取字符串。

val page1 = "<a href=\"http://weqweqwewqewqeqwe\">"
val urlMatcher = "\".+\"".toRegex()
println(page1.split(urlMatcher))

以上代码是我的想法。但是,它运行不正常。

2 个答案:

答案 0 :(得分:3)

使用括号将正则表达式匹配文本的特定部分分组:

val urlMatcher = "\"(.+)\"".toRegex()

然后使用find从类似这样的字符串中提取与您的正则表达式匹配的文本:

urlMatcher.find(text)?.groupValues?.getOrNull(1)

答案 1 :(得分:0)

您可以使用

val page1 = "<a href=\"http://weqweqwewqewqeqwe\">"
val urlMatcher = "\"([^\"]*)\"".toRegex()
// Or, you may reduce escaping with a triple-quoted string literal:
// val urlMatcher = """"([^"]*)"""".toRegex()
println(urlMatcher.find(page1)?.value)  // => "http://weqweqwewqewqeqwe"
println(urlMatcher.find(page1)?.groupValues?.getOrNull(1)) // => http://weqweqwewqewqeqwe

请参见Kotlin demo。请注意Regex#find(String)语法。取得匹配后,.value将为您获取整个匹配值(不需要.groupValues?.getOrNull(0)),.groupValues?.getOrNull(1)将为第1组中的值获取。

"([^"]*)"模式与"匹配,然后将"以外的1个或多个字符捕获到组1中(使用[^"]*),然后匹配右双引号

每当您需要匹配可能包含转义双引号"..."子字符串时使用

val urlMatcher = """(?s)(?<!\\)(?:\\{2})*("[^\\"]*(?:\\.[^"\\]*)*")""".toRegex()

要仅捕获双引号之间的子字符串,请如下所示移动捕获括号:

"""(?s)(?<!\\)(?:\\{2})*"(([^\\"]*(?:\\.[^"\\]*)*))""""
                         ^                        ^

请参见this regex demo

模式详细信息

  • (?s)-一个.现在可以匹配任何字符
  • (?<!\\)-当前位置左侧不能出现\个字符
  • (?:\\{2})*-0个或多个双反斜杠序列(因此,所有转义的引号都将被忽略)
  • "-双引号
  • ([^\\"]*(?:\\.[^"\\]*)*)-捕获组1:
    • [^\\"]*-除\"以外的0多个字符
    • (?:\\.[^"\\]*)*-0次以上的出现
      • \\.-一个\后跟任意字符
      • [^\\"]*-除\"以外的0多个字符
  • "-双引号。