【问题标题】:Get resource from RegEx String从 RegEx 字符串获取资源
【发布时间】:2015-09-17 09:44:55
【问题描述】:

经过数小时的搜索、尝试和失败,我决定在这里问我的问题。我想用从/src 加载的资源替换字符串中的:(.+?):。例如,如果我输入“:foo.bar:”,它会将其替换为this.getClass().getResource("foo.bar");

我的具体情况: 我有一个使用笑脸的小聊天应用程序,位于“src”的“笑脸”文件夹中。如果用户键入“:foo:”,它应该获取“smileys/foo.png”的完整 URL,如果文件存在(在这种情况下为this.getClass().getResource("smileys/foo.png");)并将其放入标签中。因此,例如,如果用户键入“foo :bar:”,则应将其转换为“foo C:/<...>/smileys/bar.png”。

我怎么能这样做? 谢谢你的回答,

本尼

【问题讨论】:

    标签: java regex resources expression


    【解决方案1】:

    他们在 oracle 提供的文档中解释了如何执行此操作。这通常适用于所有语言的所有正则表达式,而不仅仅是 java。

    " 反向引用在正则表达式中指定为反斜杠 () 后跟一个数字,表示要调用的组的编号。例如,表达式 (\d\d) 定义一个捕获组,匹配两个数字一行,稍后可以通过反向引用 \1 在表达式中调用。

    要匹配任意 2 位数字,后跟完全相同的两位数字,您可以使用 (\d\d)\1 作为正则表达式:

    Enter your regex: (\d\d)\1
    
    Enter input string to search: 1212
    
    I found the text "1212" starting at index 0 and ending at index 4.
    

    如果更改最后两位数字,匹配将失败:

    Enter your regex: (\d\d)\1
    
    Enter input string to search: 1234
    No match found.
    

    对于嵌套的捕获组,反向引用的工作方式完全相同:指定一个反斜杠,后跟要调用的组的编号。"

    https://docs.oracle.com/javase/tutorial/essential/regex/groups.html

    【讨论】:

    • 是的。直到这一步我才能做到。但是,如果我的表达式是“:(.+?):”,我想将其转换为this.getClass().getResource("$1")。例如:String reg = ":foo: asdf :bar:"; reg = reg.replaceAll(":(.+?):", this.getClass().getResource("$1")); 但这不起作用,因为我无法将参数$1 设置为函数的参数。
    • @Benni 我不相信你可以在一行中做到这一点。想到一种方法:您必须使用该正则表达式并拆分字符串(有一个拆分函数),然后将其放入数组中。然后将数组的每个值传递给函数,并在表达式第一次出现时将其存储。
    【解决方案2】:

    下面的代码会做你想做的事:

    String s = "x = :foo.bar: ;";
    String res = s.replaceAll(":(.+?):","this.getClass().getResource(\"$1\")");
    System.out.println(res);
    

    打印

    x = this.getClass().getResource("foo.bar") ;
    

    【讨论】:

    • 是的,但是如果我希望它执行this.getClass().getResource("foo.bar") 怎么办?我该怎么做?
    • Java 代码必须在执行前编译,所以你不能这样做。在某些解释型语言(即 JavaScript)中是可能的,但在 Java 中是不可能的。
    • 我知道它必须被编译。但我确信它必须工作。我的情况:我有一个聊天,它使用表情符号。它们位于“smileys”文件夹中,如果用户键入“:foo:”,它应该获取“smileys/foo.png”的完整 URL,如果文件存在(在这种情况下为this.getClass().getResource("smileys/foo.png");)并放入将其放入 标签中。因此,例如,如果用户键入“foo :bar:”,则应将其转换为“foo C:/<...>/smileys/bar.png”。
    • 是的,我愿意。有 HTMLEditorKit,我可以用它来为我的内容设置 HTML 样式。
    • 我不熟悉 HTMLEditorKit 但如果是 JSP 我会写一个标签来拉出正确的图像,比如&lt;mytag:getImage name="foo.bar"/&gt;