3

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

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

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

这里有一个例子可以更清楚地说明。

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

4

3 回答 3

2

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

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

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

每个字母由一个空格分隔

每个单词由三个空格分隔

于 2013-06-19T17:57:01.490 回答
1

It may be because [+.|+\s|+-] is a character class, so it may just be matching a single character. Maybe what you want is [.\s\-]+.

于 2013-06-19T17:53:56.703 回答
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)。

于 2013-06-20T05:16:13.397 回答