2016-08-01 48 views
2

我对正则表达式很陌生,现在我正在学习它。我有这样的要求:重复字的正则表达式

任何字符串都以#换行符#开头,也以#换行符#结尾。在这两个词之间,可以有(0个或更多空格)或(0个或更多#个新行#)。

下面

是一个例子:

#newline# #newline# #newline##newline# #newline##newline##newline#. 

如何为这个做正则表达式?

我已经试过了,但不工作

^#newline#|(\s+#newline#)|#newline#|#newline#$ 
+0

您的示例字符串以'#换行符'而不是'#换行符#'结尾。如果是拼写错误,请使用['^#newline#(?:\ s *#newline#)* $'](https://regex101.com/r/mI9nD2/1)。 –

回答

3

^#newline#|(\s+#newline#)|#newline#|#newline#$比赛无论是#newline#在字符串的开头(^#newline#),或1+空格,接着与#newline#(\s+#newline#)),或#newline#,或(和这个从来没有的#newline#所有匹配的情况与先前捕获)字符串末尾的#newline##newline#$)。

您可以用

^#newline#(?:\s*#newline#)*$ 

匹配这些字符串或者(如果有应至少2次出现的#newline#字符串中)

^#newline#(?:\s*#newline#)+$ 
         ^

regex demo

  • ^ - 文字串
  • (?:\s*#newline#)* - - 串
  • #newline#的开始零(:更换*+将需要至少1)或
    • \s*多个序列 - 0+空格
    • #newline# - 字面子串
  • $ - 字符串结尾。

Java demo

String s = "#newline# #newline# #newline##newline# #newline##newline##newline#"; 
System.out.println(s.matches("#newline#(?:\\s*#newline#)+")); 
// => true 

注:内部matches(),表达已锚定,并^$可以被移除。

+0

我了解*任何字符串以#换行符#开始,并且以#换行符#*要求结尾,以便##换行符#字符串应该匹配(单个'#换行符#'在开头和结尾都是字符串)。否则,''newline#''必须放在'$'前面。 –

+1

...或者最后一个'*'可以替换成'+' – Pshemo

+0

啊,是的,我现在很忙,我忽略了:) –

0

你可以试试这个还有:

#newline#[\s\S]+#newline#

它说,匹配任何与#newline#跟空格的任意组合开始或非空白字符,并以#newline#结尾。

2

据我了解需求,它应该是这样的:

^#newline#(\s|#newline#)*#newline#$ 

这将不匹配您的例子字符串,因为它不以#换行#

没有^和启动$它匹配一个子字符串。

检查出http://www.regexplanet.com/玩正则表达式。

1

请使用模式并匹配类来标识。 您可以在运行时给出patternString字符串 patternString =“newline”;

public void findtheMatch(String patternString) 
{ 
    String text ="#newline# #newline# #newline##newline# #newline##newline##newline# "; 

      Pattern pattern = Pattern.compile(patternString); 
      Matcher matcher = pattern.matcher(text); 

      while(matcher.find()) { 
       System.out.println("found: " + matcher.group(1)); 
      } 
}