java正则表达式匹配摩尔斯电码

时间:2013-06-19 17:48:26

标签: java regex string matching

我正在尝试测试莫尔斯电码是否合法。

public static boolean isMorseCode( String code ){
return code.trim().matches("[+.|+\s|+-]");      
}

莫尔斯代码行可以以.(称为Dit)和-(称为Dah)开头。它可以在行中有空格。 在两个特定代码之间有1个空格,例如.- -.,在这种情况下,仅由一个空格分隔的代码之和就是一个单词。但它也可以有3个空格,然后一个新单词开始。我正在使用trim来排除在行的开头和结尾可能有空格的事实。

这是一个让它更清晰的例子。

我们使用“Hello World”进行解释。白色空间通过张贴来消除,所以看看http://www.rubular.com/r/r2iwqgUHCB还有我使用的正则表达式。在java中它不起作用。如果有人能够解释它为什么不起作用,甚至告诉我它是如何工作的,我将非常感激。

3 个答案:

答案 0 :(得分:2)

你可以用这个描述摩尔斯电码:

[.-]{1,5}(?> [.-]{1,5})*(?>   [.-]{1,5}(?> [.-]{1,5})*)*

莫尔斯字母的每个元素都有1或5个Dit或Dah。

每个字母用一个空格分隔

每个单词用三个空格分隔

答案 1 :(得分:1)

可能是因为[+.|+\s|+-]是一个字符类,所以它可能只匹配一个字符。也许你想要的是[.\s\-]+

答案 2 :(得分:1)

出于好奇,为什么不只是验证字符串是否包含已知序列?

如果字符串包含有效的莫尔斯代码字母,标点符号或数字,则此正则表达式仅匹配匹配。字符串开头或结尾的任何空格都会被自动忽略。表达式要求字符之间有1或3个空格。

^\s*(?:\s*(?:\.-|-\.\.\.|-\.-\.|-\.\.|\.|\.\.-\.|--\.|\.\.\.\.|\.\.|\.---|-\.-|\.-\.\.|--|-\.|---|\.--\.|--\.-|\.-\.|\.\.\.|-|\.\.-|\.\.\.-|\.--|-\.\.-|-\.--|--\.\.|-----|\.----|\.\.---|\.\.\.--|\.\.\.\.-|\.\.\.\.\.|-\.\.\.\.|--\.\.\.|---\.\.|----\.|\.-\.-\.-|--\.\.--|\.\.--\.\.|\.----\.|-\.-\.--|-\.\.-\.|-\.--\.|-\.--\.-|\.-\.\.\.|---\.\.\.|-\.-\.-\.|-\.\.\.-|\.-\.-\.|-\.\.\.\.-|\.\.--\.-|\.-\.\.-\.|\.\.\.-\.\.-|\.--\.-\.)(?=\s|\s{3}|\s*$))+\s*$

Java代码示例

<强>代码

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "         .... . .-.. .-.. ---   .-- --- .-. .-.. -..      ";
  Pattern re = Pattern.compile("^\\s*((?:\\s*?(?:\\.-|-\\.\\.\\.|-\\.-\\.|-\\.\\.|\\.|\\.\\.-\\.|--\\.|\\.\\.\\.\\.|\\.\\.|\\.---|-\\.-|\\.-\\.\\.|--|-\\.|---|\\.--\\.|--\\.-|\\.-\\.|\\.\\.\\.|-|\\.\\.-|\\.\\.\\.-|\\.--|-\\.\\.-|-\\.--|--\\.\\.|-----|\\.----|\\.\\.---|\\.\\.\\.--|\\.\\.\\.\\.-|\\.\\.\\.\\.\\.|-\\.\\.\\.\\.|--\\.\\.\\.|---\\.\\.|----\\.|\\.-\\.-\\.-|--\\.\\.--|\\.\\.--\\.\\.|\\.----\\.|-\\.-\\.--|-\\.\\.-\\.|-\\.--\\.|-\\.--\\.-|\\.-\\.\\.\\.|---\\.\\.\\.|-\\.-\\.-\\.|-\\.\\.\\.-|\\.-\\.-\\.|-\\.\\.\\.\\.-|\\.\\.--\\.-|\\.-\\.\\.-\\.|\\.\\.\\.-\\.\\.-|\\.--\\.-\\.)(?=\\s|\\s{3}|\\s*$))+)\\s*$",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
  Matcher m = re.matcher(sourcestring);
    if(m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + groupIdx + "] = " + m.group(groupIdx));
      }
    }
  }
}

<强>输出

捕获组0获取整个匹配的输入字符串。第1组获得修剪后的句子。

[0] =>          .... . .-.. .-.. ---   .-- --- .-. .-.. -..      
[1] => .... . .-.. .-.. ---   .-- --- .-. .-.. -..

如果字符串无效,正则表达式将不返回任何内容(也称为false)。