表示为String的2D矩阵的正则表达式

Osc*_*nez 7 java regex matrix

我试图在表示为字符串的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)

我的解决方案不需要精确,因此我试图使用可能糟糕的正则表达式方法.

sda*_*zig 0

我想我明白你想在这里做什么。您定义的“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 来实现此目的。