我试图在表示为字符串的2D矩阵中搜索模式.请注意以下事项:
// horizontal line
String pat1 =
"............." +
"............." +
"............." +
"....XXXX....." +
"............." +
".............";
// vertical line
String pat2 =
"............." +
"......X......" +
"......X......" +
"......X......" +
"......X......" +
".............";
Run Code Online (Sandbox Code Playgroud)
搜索第一个模式将是微不足道的,正则表达式将是这样的:
X+
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,它有点棘手但可行,因为我知道矩阵的列数和行数:
(X.{`WIDTH - 1`})+
Run Code Online (Sandbox Code Playgroud)
当我遇到问题想出正确的正则表达式时,我试图找出一种方法来识别以下模式:
// fixed but unknown number of columns
String pat3 =
"............." +
".....XXX....." +
".....XXX....." +
".....XXX....." +
".....XXX....." +
".............";
// variable number of columns
String pat4 =
"............." +
".....XXX....." +
"....XXXXX...." +
"...XXXXXXX..." +
".....XXX....." +
".............";
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是一种创建相当于以下的正则表达式模式的方法:
(X.{`WIDTH - PREVCOUNT`})+
Run Code Online (Sandbox Code Playgroud)
PREVCOUNT
最后匹配模式的长度在哪里(我知道我会错过pat4中第4行的第一个X,但我可以忍受它).我知道正则表达式中存在前瞻性,但我想知道我想要实现的目标是否可行.即使有可能,我也担心使用前瞻的性能,因为我不完全了解它们如何在内部工作.
有没有办法通过单个正则表达式验证来执行此操作,或者我是否必须逐行搜索然后尝试查看X是否都是连续的?
编辑:作为澄清,我试图搜索X的"blob".只要在列/行之间存在连续的X,就可以将其视为属于blob.几个例子:
String blob1 =
"............." +
"......XX....." +
"....XXXX....." +
"...XXXXX....." +
".....XXX....." +
".............";
String blob2 =
"............." +
".....XXX....." +
"....XXXXX....." +
"...XXXXXXX..." +
"....XXXXX...." +
".....XXX.....";
String blob3 =
"............." +
".....XXX....." +
".....XXX......" +
".....XXX....." +
"............." +
".............";
String notblob =
"............." +
"..XXX........" +
"......XXX....." +
"..XXX........." +
".............." +
".............";
Run Code Online (Sandbox Code Playgroud)
我的解决方案不需要精确,因此我试图使用可能糟糕的正则表达式方法.
我想我明白你想在这里做什么。您定义的“prevcount”信息不足以匹配该模式。您必须考虑“下一个宽度”才能确定要检查的点数。但是,我不确定您是否真的在验证这个简单的模式。X+ 也会连续匹配 5 个 X。在你的第二个模式中,第一行或最后一行可能是两个 X,而你不会检测到这一点。
也就是说,这是一种使用 pat3 提供类似验证的方法:
(X{3}.{`WIDTH-3`})+
Run Code Online (Sandbox Code Playgroud)
我可能通过重复 X 模式打破了另一个禁忌,但您需要这样做才能使重复模式与“X 块”的开始和停止保持一致。
pat4 甚至更棘手。没有真正的方法可以保留一次检查一行的验证顺序。你可以这样做:
(X{3}.{`WIDTH-4`}|X{5}.{`WIDTH-6`}|X{5}.{`WIDTH-6`}|X{3}.{`WIDTH-5`})+
Run Code Online (Sandbox Code Playgroud)
但是这样你就很容易验证一个矩阵,其中的行交换了,并且 X 块每一侧的点也发生了变化以适应。但是,您可以尝试一次检查所有行:
(X{3}.{`WIDTH-4`}X{5}.{`WIDTH-6`}X{5}.{`WIDTH-6`}X{3}.{`WIDTH-5`})
Run Code Online (Sandbox Code Playgroud)
这不会对性能产生任何额外的影响。它可能会更有效,因为您只需要启动正则表达式模式编译+匹配一次的开销。
附注:如果您将矩阵的宽度用于多行字符串,则它将不起作用。您需要添加一个来说明新行字符。然后你需要确保你的“.” 也捕获换行符。在 Java 中,您可以使用 Pattern.DOTALL 来实现此目的。