java - 正则表达式匹配,Java。匹配和提取

标签 java regex pattern-matching

我知道这已被问过一百万次,但我无法让它发挥作用。 我正在从游戏的 Web API 中过滤字符串(http://pathofexile.com/api/public-stash-tabs——小心,大约 5MB 的数据将从 GET 中检索),试图找到我正在查看的属性类型,因为我稍后需要替换它。 (我正在查看每个 Item 对象中的“explicitMods”数组,并确定它是哪种类型的修饰符。)

我的目标是首先确定我正在处理的修饰符类型,然后使用 String.replaceAll 将正确的字符串替换为 ## 以便我可以稍后将 ## 替换为实际值并进行搜索。我将存储这些值或范围,以便我以后可以识别匹配的内容。 String.replaceAll 不包括在这里,因为那个位工作得很好。

这是我的测试课。所有测试都失败了。我确实在 regex101.com 上测试了每个模式,但他们只有 javascript、php、python 和 golang 测试器。每个方法注释都有指向我在 regex101 上进行的测试的链接。

package arbitrary.package.name;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.junit.Assert.assertTrue;

public class RegexTests {

  private static Logger log = LoggerFactory.getLogger(RegexTests.class);

  @Test
  public void testIntegers() {
    // https://regex101.com/r/PVfYGX/1
    assertTrue(compileAndMatch("/.*(.\\d+).+(.\\d+).*/", "Adds 80 to 115 Physical Damage"));
  }

  @Test
  public void testIntegersWithRanges() {
    // https://regex101.com/r/u3UQqM/1
    assertTrue(compileAndMatch("/.*(\\d+-\\d+).*(\\d+-\\d+).*/", "Adds (4-5) to (8-9) Physical Damage"));
  }

  @Test
  public void testDecimals() {
    // https://regex101.com/r/CpaV1y/1
    assertTrue(compileAndMatch("/.*(\\d+.?\\d+).*/", "0.2% of Elemental Damage Leeched as Life"));
  }

  private boolean compileAndMatch(String regex, String text) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    log.info("{} {} \"{}\"", regex, matcher.matches() ? "matches" : "does not match", text);
    return pattern.matcher(text).matches();
  }
}

示例堆栈跟踪(全部相同):

2017-02-20 20:35:44.876 [main] INFO  arbitrary.package.name.RegexTests - /.*(\d+.?\d+).*(\d+.?\d+).*/ does not match "Adds (4-5) to (8-9) Physical Damage" 

java.lang.AssertionError
    at org.junit.Assert.fail(Assert.java:86)
    at org.junit.Assert.assertTrue(Assert.java:41)
    at org.junit.Assert.assertTrue(Assert.java:52)
    at arbitrary.package.name.RegexTests.testIntegersWithRanges(RegexTests.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

预先感谢您的帮助,

最佳答案

使用

".*(\\d+-\\d+).*(\\d+-\\d+).*"

Java

String regex = ".*(\\d+-\\d+).*(\\d+-\\d+).*";
String text = "Adds (4-5) to (8-9) Physical Damage";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);

System.out.println(matcher.matches());

关于java - 正则表达式匹配,Java。匹配和提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42357319/

相关文章:

java - java中的final方法

java - Hibernate - 这个映射是否正确?无法通过反射 getter 获取字段值?

syntax - 一元计算中的短路 "uninteresting"情况

Java正则表达式查找方法为匹配罗马数字返回false

java - 在 AEM 中使用 MagickQuick 进行图像压缩

java - 无法设置默认按钮 (btn) : no object to call upon

java - 用于提取异常消息字段的正则表达式

regex - 如何使用 sed 替换正则表达式捕获组?

php - 是否可以检查数学表达式字符串?

algorithm - SQL语句的模式识别