Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 表示为字符串的二维矩阵上的正则表达式_Java_Regex_Matrix - Fatal编程技术网

Java 表示为字符串的二维矩阵上的正则表达式

Java 表示为字符串的二维矩阵上的正则表达式,java,regex,matrix,Java,Regex,Matrix,我试图在二维矩阵中搜索表示为字符串的模式。想象一下: // horizontal line String pat1 = "............." + "............." + "............." + "....XXXX....." + "............." + "............."; // vertical line String pat2 = "............." + "

我试图在二维矩阵中搜索表示为字符串的模式。想象一下:

// horizontal line
String pat1 =
    "............." +
    "............." +
    "............." +
    "....XXXX....." +
    "............." +
    ".............";

// vertical line
String pat2 =
    "............." +
    "......X......" +
    "......X......" +
    "......X......" +
    "......X......" +
    ".............";
搜索第一个模式很简单,正则表达式类似于:

X+
在第二种情况下,这有点棘手,但可行,因为我知道矩阵的列数和行数:

(X.{`WIDTH - 1`})+
当我在试图找出一种识别以下模式的方法时,遇到了提出正确正则表达式的问题:

// fixed but unknown number of columns
String pat3 =
    "............." +
    ".....XXX....." +
    ".....XXX....." +
    ".....XXX....." +
    ".....XXX....." +
    ".............";

// variable number of columns
String pat4 =
    "............." +
    ".....XXX....." +
    "....XXXXX...." +
    "...XXXXXXX..." +
    ".....XXX....." +
    ".............";
我要寻找的是一种创建regex模式的方法,相当于:

(X.{`WIDTH - PREVCOUNT`})+
其中,
PREVCOUNT
是最后一个匹配模式的长度(我知道我会错过第4部分第4行的第一个X,但我可以接受)。我知道在正则表达式中有一些看起来像头的东西,但我想知道我所尝试实现的是否是可能的。即使有可能,我也担心使用lookahead会对性能造成影响,因为我不完全了解它们在内部是如何工作的

有没有一种方法可以通过单个正则表达式验证来实现这一点,或者我必须逐行搜索,然后尝试查看X是否都是连续的

编辑:作为澄清,我试图搜索X的“斑点”。只要跨列/行存在连续的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........." +
    ".............." +
    ".............";

我的解决方案不需要精确,因此我尝试使用一种可能很糟糕的正则表达式方法。

我想我知道你在这里想做什么。您定义的“prevcount”信息不足,无法匹配模式。为了确定要检查的点数,您必须考虑“下一个宽度”。然而,我不确定您是否真的在验证哪怕是微不足道的模式。X+也将连续匹配5个X。在第二种模式中,第一行或最后一行可能是两个X,而你不会检测到

也就是说,这里有一种方法可以为pat3提供类似的验证:

(X{3}.{`WIDTH-3`})+
我可能打破了另一个禁忌,通过重复X模式,但您需要这样做,以使重复模式与“X块”的开始和停止保持一致

pat4更为棘手。没有真正的方法来保持每次检查一行的验证顺序。您可以这样做:

(X{3}.{`WIDTH-4`}|X{5}.{`WIDTH-6`}|X{5}.{`WIDTH-6`}|X{3}.{`WIDTH-5`})+
但是你很容易验证一个矩阵,因为它的行是交换的,X块的每一侧的点都会改变以适应。但是,您可以尝试一次检查所有行:

(X{3}.{`WIDTH-4`}X{5}.{`WIDTH-6`}X{5}.{`WIDTH-6`}X{3}.{`WIDTH-5`})
这将不会有任何额外的性能打击。这可能会更有效,因为只需启动一次regex模式compile+match的开销

琐碎的旁注:
如果将矩阵的宽度用于多行字符串,则它将不起作用。您需要添加一个,以说明新行字符。然后,您需要确保“.”也捕获换行符。在Java中,您可以使用Pattern.DOTALL来实现此目的。

我认为一个优雅的解决方案是首先抑制所有单X序列,包括水平和垂直方向,例如:

String blob = ".....";
blob.replaceAll("([^X])X([^X])", "$1.$2")
    .replaceAll("([^X].....)X(.....[^X])","$1.$2");
然后,至少2个X的所有剩余序列都是BLOB。 请注意,要解决sdanzig提到的相同问题,您应该首先使用非XE的“边界”来“扩展”blob。

这是使用正则表达式无法解决的。 基本上,您将矩阵定义为:

0^k1 X^l1 0^m1
0^k2 X^l2 0^m2
0^k3 X^l3 0^m3

000XX000
 ^  ^ ^
 k  l m
其中,0^a表示“字符“0”重复一次,
k代表X之前0的重复次数
l代表X的重复次数
m代表X之后0的重复次数
ki+li+mi=行宽度,对于任何i

现在,您的blob标准是:

mi + k(i+1) < row_width
ki + m(i+1) < row_width
these two conditions should meet for any i
mi+k(i+1)
正则语言无法匹配这样的模式,它们没有内存,因此没有正则表达式解决您的问题



正确的解决方案包括计算连接的组件有多少个独立的组件。

请指定您的编程语言好吗?谢谢。我一直在使用Java,不知道你在寻找什么样的结果,也不知道你想要达到什么样的效果。你能举一个正则表达式输出的例子吗?您正在查找每个X序列的索引位置吗?或者每个X序列的长度?我想指出的一点是,字符串中没有列,因为没有换行符:尽管代码格式不同,但都是一行。即使是单行字符串,它也表示一个具有已知列数和行数的2D矩阵。我试图找到某种模式的“斑点”(在本例中,用X表示)。我将对问题进行编辑,以澄清一点more@omtinez您是否需要仅使用正则表达式来执行此操作?我注意到多行字符串上的错误,我的实际输入实际上没有,因此我错过了+1。如果我正确理解了您的答案,那么您是在逐字解释我的模式,但是包含X的行/列的数量是不可预测的。换句话说,我使用了
X+
,因为一行可以有4、5或
宽度
X,我试图匹配它们;这同样适用于所有其他模式。考虑到这一点,我认为任何带有硬编码的答案都不能解决我的问题。我建议你的问题不要那么模棱两可,以节省其他人同样浪费的时间:)我很抱歉,谢谢你花时间回答。我对我的问题做了澄清,如果这不足以让问题更容易理解,请告诉我你是对的,但请看下面我的回答。如果你真的喜欢正则表达式,你可以这样做。这是一个有效的解决方案。我只是回应,因为你说这是一个正则表达式解决方案;它不是,它是Java。它可以帮助你