使用正则表达式(java 1.6)将字符串与文件名匹配

使用正则表达式(java 1.6)将字符串与文件名匹配,java,regex,Java,Regex,我有一堆名为nineDiamonds.gif和aceharts.gif的图像,还有一个用于扑克牌的“Card”类 在构造函数中,我希望传递一个卡名字符串,并能够创建具有正确图像的JPanel。很简单,但我希望能够通过以下内容: “9颗红心”=>nineHearts.gif “9颗心”=>nineHearts.gif “心之九”=>nineHearts.gif Integer.toString(9)+“hearts”=>nineHearts.gif Integer.toString(1)+“he

我有一堆名为nineDiamonds.gif和aceharts.gif的图像,还有一个用于扑克牌的“Card”类

在构造函数中,我希望传递一个卡名字符串,并能够创建具有正确图像的JPanel。很简单,但我希望能够通过以下内容:

  • “9颗红心”=>nineHearts.gif
  • “9颗心”=>nineHearts.gif
  • “心之九”=>nineHearts.gif
  • Integer.toString(9)+“hearts”=>nineHearts.gif
  • Integer.toString(1)+“hearts”=>aceharts.gif
  • “心之王”=>aceharts.gif
我知道我可以让构造器超负荷工作,用开关来匹配,但我真正想要的是一个优雅的、功能型的解决方案,大致如下:

String fileName = name.replaceAll("magic regex") + ".gif";

谢谢

以下是一些可以帮助您找到有效解决方案的提示:

  • 使用带单词边界的正则表达式去除单词“of”(
    \bof\b
  • 将数字字符串替换为各自的单词(可以使用定义数字的映射(例如,
    map[9]=“nine”
    )和for循环来完成)
  • 使用
    String.split()
    在单词边界处拆分,然后对除第一个单词以外的所有单词进行催化并重新联接

因此,归根结底,正则表达式本身并不是最好的解决方案,通常情况下也是如此。

以下是一些可以帮助您找到有效解决方案的技巧:

  • 使用带单词边界的正则表达式去除单词“of”(
    \bof\b
  • 将数字字符串替换为各自的单词(可以使用定义数字的映射(例如,
    map[9]=“nine”
    )和for循环来完成)
  • 使用
    String.split()
    在单词边界处拆分,然后对除第一个单词以外的所有单词进行催化并重新联接
因此,归根结底,正则表达式本身并不是最好的解决方案,通常情况下就是这样。

一个
.replaceAll()
是不够的

将字符串小写<代码>(\S+)\S*(?:of)?\S*(红心俱乐部钻石黑桃)将解析
9颗红心和
9颗红心到(“9”、“红心”)和
aceofclubs到(“ace”、“俱乐部”)。创建一个映射“1”到“ace”的映射。。。“13”改为“国王”;把比赛的前几组传过去。然后文件名的创建就变得微不足道了。

一个
.replaceAll()
是不够的


将字符串小写<代码>(\S+)\S*(?:of)?\S*(红心俱乐部钻石黑桃)
将解析
9颗红心和
9颗红心到(“9”、“红心”)和
aceofclubs到(“ace”、“俱乐部”)。创建一个映射“1”到“ace”的映射。。。“13”改为“国王”;把比赛的前几组传过去。那么文件名的创建就变得微不足道了。

这个正则表达式的解决方案如何比正确地执行更优雅?@ryanprayogo什么是正确的?好的,这就变成了对整个单词的否定,其中已经有几个问题得到了很好的回答。但我仍然没有让它发挥作用:String s=“1 of hearts”;System.out.println(s.replaceAll(“[[\\s\\s]&&&[^1-9]&&[^(?。*diamonds.*$]),”)==>“1oas”。“oas”不应该被“[\\s\\s]”去掉吗?这个正则表达式解决方案如何比正确使用更优雅?@ryanprayogo什么是正确的?好的,所以这变成了对整个单词问题的否定,其中有几个问题已经得到了很好的回答。但我仍然没有让它发挥作用:String s=“1 of hearts”;System.out.println(s.replaceAll(“[[\\s\\s]&&&[^1-9]&&[^(?。*diamonds.*$]),”)==>“1oas”。“oas”不应该被“[\\s\\s]”去掉吗?我想你一开始是指
(\d+)
,而不是
(\s+)
。好吧,现在我有一张100多行的地图,上面有“cardImageMap.put”(“1clubs”,newimageicon(“cardImages/aceClubs.gif”);“-我想这很好,但是像“s=s.replaceAll”()这样的策略有什么问题吗13、“国王”).replaceAll(“12”、“女王”).replaceAll(“红心”、“红心”);“?@toms=s.replace。。。13次,当只需要1次时,请考虑一下,2次for循环也会缩短地图创建时间code@Tom:是的,有一些问题。我的意思是一张包含13个条目的地图,用规范名称替换数值,这样“1个俱乐部”。变成“aceClubs.gif”。您使用my regexp将输入分成两部分;比赛的
.group(1)
为排名,
.group(2)
为适合。如果秩都是数字,则将其映射到名称。然后用大写字母表示西服的第一个字符,并将其全部组合起来。我已经从正则表达式中删除了拼写错误,现在它确实起作用了:)我想你一开始是指
(\d+)
,而不是
(\s+)
。好吧,现在我有了一张100多行的地图,上面有“cardImageMap.put”(“1clubs”,newimageicon(“cardImages/aceClubs.gif”);”我认为这很好,但是像“s=s.replaceAll(“13”,“国王”)。replaceAll(“12”,“女王”)。replaceAll(“红心”,“红心”);”这样的strat有什么问题吗?@Tom s=s.replace。。。13次,当只需要1次时,请考虑一下,2次for循环也会缩短地图创建时间code@Tom:是的,有一些问题。我的意思是一张包含13个条目的地图,用规范名称替换数值,这样“1个俱乐部”。变成“aceClubs.gif”。您使用my regexp将输入分成两部分;比赛的
.group(1)
为排名,
.group(2)
为适合。如果秩都是数字,则将其映射到名称。然后用大写字母表示西服的第一个字符,并将其全部组合在一起。我已经从正则表达式中删除了拼写错误,现在它实际上可以工作了:)