在字符串的任意位置出现一个字符的正则表达式

时间:2019-09-01 05:07:58

标签: java regex

我正在编写一个Java代码,该方法可以从任何迷宫中寻找出路,并且我需要一个检查生成的迷宫的类。只能使用class MyModule(torch.nn.Module): def __init__(self): super(MyModule,self).__init__() # Feel free to use something more useful than a simple linear layer self._network = torch.nn.Linear(...) # Do your stuff ... def fit(self, inputs, labels): """ Trains the model to predict the right label for a given input """ # Compute the whitening matrix and inputs self._zca_mat = compute_zca(inputs) whitened_inputs = torch.mm(self._zca_mat, inputs) # Apply training on the whitened data outputs = self._network(whitened_inputs) loss = torch.nn.MSEloss()(outputs, labels) loss.backward() optimizer.step() def forward(self, input): # You always need to apply the zca transform before forwarding, # because your network has been trained with whitened data whitened_input = torch.mm(self._zca_mat, input) predicted_label = self._network.forward(whitened_input) return predicted_label .#S个字符。

  1. X.-允许在字符串的任何位置多次出现

  2. #S-允许在字符串的任何位置出现一个且不超过一个。

X-第一个条件的正则表达式, 但是我不能实现第二个。

迷宫输入如下:

^[#//.]+$

。 -空白,#-墙壁,S-开始,X-退出

3 个答案:

答案 0 :(得分:4)

您可以使用negative lookahead groups(写成(?!...))来实现此目的,就像这样:

^(?!.*S.*S)(?!.*X.*X)[SX.#]+$

Demo

此操作从字符串的开头使用S接受字符集中的任何字符集(X.#^)和[SX.#]+。但它拒绝包含2个S s((?!.*S.*S))或2个X s((?!.*X.*X))的任何字符串。

请注意,这实际上检查了您的两个条件。您实际上并不需要2个正则表达式。但是,基于示例迷宫,您的输入看起来可以跨越多行。在这种情况下,您需要在最终的字符类中添加\n

答案 1 :(得分:1)

如果迷宫字符串由所有行组成,则可以使用一次先行断言仅声明一个S,然后仅匹配一个X(或相反)

^(?=[^S]*S[^S]*$)[.S#\r\n]*X[.S#\r\n]*$

在Java中

String regex = "^(?=[^S]*S[^S]*$)[.S#\\r\\n]*X[.S#\\r\\n]*$";

说明

  • ^字符串的开头
  • (?=正向前进,断言右边是S的一次出现
    • [^S]*S匹配0次以上任何没有S的字符,匹配 S
    • [^S]*$匹配0+次任何不带S的字符,字符串结尾
  • )提前关闭
  • [.S#\r\n]*X匹配所有接受的字符,包括不带X的换行符,然后匹配 X
  • [.S#\r\n]*匹配所有接受的字符,包括不带X的换行符
  • $字符串结尾

{{3}}

答案 2 :(得分:1)

您也可以capture个字符,这些字符只能被允许一次,一旦找到一个,就用lookahead检查前面是否还有另一个。大概不需要多次扫描整个字符串。

^(?:[.#]*([SX])(?!.*?\1))*[.#]*$

Here is a demo at regex101