首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java regexp匹配morse代码

java regexp匹配morse代码
EN

Stack Overflow用户
提问于 2013-06-20 01:48:26
回答 3查看 1.7K关注 0票数 3

我在试着测试摩尔斯电码是否合法。

代码语言:javascript
复制
public static boolean isMorseCode( String code ){
return code.trim().matches("[+.|+\s|+-]");      
}

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

下面是一个更清晰的例子。

我们用"Hello World“来解释。空格是通过发布它们来清除的,所以看看http://www.rubular.com/r/r2iwqgUHCB,还有我使用的regexp。在java中,it‘t work.If,有人可以解释为什么它不工作,或者甚至向我展示它是如何工作的,我将非常感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-20 01:57:01

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

代码语言:javascript
复制
[.-]{1,5}(?> [.-]{1,5})*(?>   [.-]{1,5}(?> [.-]{1,5})*)*

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

每个字母由一个空格分隔

每个单词由三个空格隔开

票数 2
EN

Stack Overflow用户

发布于 2013-06-20 01:53:57

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

票数 1
EN

Stack Overflow用户

发布于 2013-06-20 13:16:13

出于好奇,为什么不直接验证包含已知序列的字符串呢?

只有当字符串包含有效的摩尔斯电码字母、标点符号或数字时,此正则表达式才会匹配。字符串开头或结尾的任何空格都会被自动忽略。并且表达式要求字符之间有1个或3个空格。

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

Java代码示例

代码

代码语言:javascript
复制
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获取整个匹配的输入字符串。第一组得到修剪后的句子。

代码语言:javascript
复制
[0] =>          .... . .-.. .-.. ---   .-- --- .-. .-.. -..      
[1] => .... . .-.. .-.. ---   .-- --- .-. .-.. -..

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17197887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档