给出以下字符串(stringToTest):
G2:7JAPjGdnGy8jxR8[RQ:1,2]-G3:jRo6pN8ZW9aglYz[RQ:3,4]
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]
字符串7JAPjGdnGy8jxR8
和jRo6pN8ZW9aglYz
是可变长度的哈希值。
任何人都可以帮助我使用正确的正则表达式,以便开始查看RQ:3,4
的G2,但是如果到达字符串或-G的末尾(下一节的开始)就停止了。
答案 0 :(得分:2)
您可以在此正则表达式之间使用负前瞻:
Y
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)
在此正则表达式中尝试使用[^[]
代替\S
:G2:[^[]*\[RQ:3,4
[^[]
表示除[
以外的任何字符
(考虑到不可能使用诸如G2:7JAP[jGd]nGy8[]R8[RQ:3,4]
这样的字符串)