【问题标题】:Regular Expression in Java Vs regular expression in Shell ScriptJava 中的正则表达式与 Shell 脚本中的正则表达式
【发布时间】:2012-01-25 04:39:55
【问题描述】:

我的任务是在 java 和 shell 脚本中编写一个正则表达式,它将验证所有仅包含一个数字以及该数字前后任意数量的字符的字符串。

我写了[a-z]*[0-9]{1}[a-z]*,它适用于Java,但它根本不适用于Shell Script 任何人都可以帮我创建一个满足我在 Shell 脚本

中要求的常规 esxpression

编辑 (来自 cmets): 我尝试使用grep,但它没有给我有用的结果。 [...]如果字符串验证我想执行某些操作。所以我像使用它一样

if [$password eq [a-z]*[0-9]{1}[a-z]]; then 
    # "do this" 
else 
    # "do that" 
fi 

您能否说明与正则表达式相关的 Java 和 shell 脚本的语法差异?

【问题讨论】:

  • 哪种脚本语言?哪个操作系统?
  • 你能显示你在shell中使用的代码吗?
  • shell 脚本中的正则表达式是什么意思?用什么工具? grep?包含正则表达式的 shell cmd 看起来如何?顺便说一句,{1} 可以省略
  • @duffymo - 脚本语言 - shell 脚本操作系统 - RHL
  • @ Mark Byers 和 Kent - 我只是在做 if [$password -eq [a-z]*[0-9]{1}[a-z]*];然后执行此操作,否则执行此操作。在此先感谢

标签: java regex shell


【解决方案1】:

您没有指定哪个工具应在 shell 环境中评估正则表达式。但大多数工具无法识别{1} 部分。这部分无论如何都不是必需的,因为单独的 [0-9] 也代表恰好出现一次。

shell 脚本部分如下所示:

if [[ "$var" =~ ^[a-zA-Z]*[0-9][a-zA-Z]*$ ]]; then
    echo matching
else
    echo not matching
fi

关键部分是:

  • 使用[[ 表达式,而不是[ 表达式,因为前者支持模式匹配(通过==)和正则表达式匹配(通过=~
  • =~ 与大多数正则表达式库一样,如果模式匹配字符串的 any 部分(不一定是完整字符串),则将返回 true。例如,[a-z]*[0-9][a-z]* 将匹配 foo123bar456bla,因为该模式将 3bar 部分匹配为“第一个 [a-z] 出现零次,[0-9] 出现一次,第二个 [a-z] 出现三次”。因此有必要使用^$ 将正则表达式固定到字符串的开头和结尾。

在 Java 中:

String var = ...;
if( var.matches("[a-zA-Z]*[0-9][a-zA-Z]*") )
    System.out.println("matches");

这里String.matches 隐式匹配完整的字符串。历史有点糊涂了。

【讨论】:

  • 感谢您的回复...我尝试使用 grep 但它没有给我有用的结果。基本上我想在 if 语句中使用它,如果字符串验证我想执行某些操作。所以我像 if [$password eq [a-z]*[0-9]{1}[a-z]];然后“做这个”,否则“做那个”fi 你能否对与正则表达式相关的java和shell脚本中的语法差异有所了解
  • @omkarsohani:请将您的评论移至问题本身,因为它对答案很重要。以后搜索类似信息的人可能找不到其他信息。
  • 对于 java 我的代码而不是我的正则表达式正如我已经说过的那样工作。但是相同的正则表达式不适用于 shell 脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2015-12-29
  • 2015-04-27
  • 2016-06-06
  • 1970-01-01
相关资源
最近更新 更多