字符串之间的Java模式正则表达式搜索

时间:2018-08-29 09:51:17

标签: java regex

给出以下字符串(stringToTest):

  1. G2:7JAPjGdnGy8jxR8[RQ:1,2]-G3:jRo6pN8ZW9aglYz[RQ:3,4]
  2. G2:7JAPjGdnGy8jxR8[RQ:3,4]-G3:jRo6pN8ZW9aglYz[RQ:3,4]

模式:

Pattern p = Pattern.compile("G2:\\S+RQ:3,4");
if (p.matcher(stringToTest).find())
{
    // Match
}

对于字符串1,我不想匹配,因为RQ:3,4与G3部分而不是G2相关联,并且我希望字符串2与之匹配,因为RQ:3,4与G2部分相关联。

当前正则表达式的问题在于,即使我不想考虑超过G2部分,它也会搜索得太远,最终到达情况1的RQ:3,4

stringToTest也可能是(仅一个部分):

G2:7JAPjGdnGy8jxR8[RQ:3,4]

字符串7JAPjGdnGy8jxR8jRo6pN8ZW9aglYz是可变长度的哈希值。

任何人都可以帮助我使用正确的正则表达式,以便开始查看RQ:3,4的G2,但是如果到达字符串或-G的末尾(下一节的开始)就停止了。

3 个答案:

答案 0 :(得分:2)

您可以在此正则表达式之间使用负前瞻:

Y

RegEx Demo

RegEx详细信息:

  • Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGrid.CellFormatting For i As Integer = 0 To dt_result.Rows.Count() - 1 If dt_result.Rows.Count() - 0 Then DataGrid.Rows(i).DefaultCellStyle.BackColor = Color.Green End If Next Dim drv As DataRowView If e.RowIndex >= 0 Then If e.RowIndex <= dt_result.Rows.Count - 1 Then drv = dt_result.DefaultView.Item(e.RowIndex) Dim c As Color If drv.Item("Status").ToString = "Working" Then c = Color.Green Else c = Color.Red End If e.CellStyle.BackColor = c End If End If DataGrid.DataSource = dt_result Dim drv As DataRowView Dim drvs = dt_result End Sub :匹配文字G2:(?:(?!G\d+:)\S)*RQ:3,4
  • G2:创建一个非捕获组
    • G2::断言我们前面没有(?:
    • (?!G\d+:):匹配一个非空白字符
  • G<digit>::结束非捕获组。匹配0个或更多
  • \S:匹配文字)*

在Java中使用此正则表达式:

RQ:3,4

答案 1 :(得分:1)

问题是\S与任何空格字符匹配,并且正则表达式引擎从左到右解析文本。找到G2:后,它会向右抓取所有非空格(因为\S*是一个令人讨厌的子模式),然后回溯以找到最右边出现的RQ:3,4

通常情况下,您可以使用

String regex = "G2:(?:(?!-G)\\S)*RQ:3,4";

请参见regex demo(?:(?!-G)\S)*是一种经过磨炼的贪婪令牌,它将与0+次出现的非空白char匹配,这些非char不会以-G子字符串开头。

如果连字符只能在下一部分前面,则可以从-中减去\S

String regex = "G2:[^\\s-]*RQ:3,4"; // using a negated character class
String regex = "G2:[\\S&&[^-]]*RQ:3,4"; // using character class subtraction

请参见this regex demo[^\\s-]*将匹配0个或多个除空格和-以外的字符。

答案 2 :(得分:0)

在此正则表达式中尝试使用[^[]代替\SG2:[^[]*\[RQ:3,4

[^[]表示除[以外的任何字符

Demo

(考虑到不可能使用诸如G2:7JAP[jGd]nGy8[]R8[RQ:3,4]这样的字符串)