小编PNS*_*PNS的帖子

Java Pattern Matcher:创建新的还是重置?

假设a Regular Expression,通过Java Matcher对象与大量字符串匹配:

String expression = ...; // The Regular Expression
Pattern pattern = Pattern.compile(expression);
String[] ALL_INPUT = ...; // The large number of strings to be matched

Matcher matcher; // Declare but not initialize a Matcher

for (String input:ALL_INPUT)
{
    matcher = pattern.matcher(input); // Create a new Matcher

    if (matcher.matches()) // Or whatever other matcher check
    {
         // Whatever processing
    }
}
Run Code Online (Sandbox Code Playgroud)

Java SE 6 JavaDoc for Matcher中,可以Matcher通过该reset(CharSequence)方法找到重用同一对象的选项,正如源代码所示,该方法比Matcher每次创建新对象要便宜一些,即,与上面不同,可以做: …

java regex matcher reset

21
推荐指数
1
解决办法
1万
查看次数

Java日期解析具有微秒或纳秒精度

根据SimpleDateFormat类文档,Java它的日期模式不支持超过毫秒的时间粒度.

所以,日期字符串就像

  • 2015-05-09 00:10:23.999750900 //最后9位数字表示纳秒

通过模式解析时

  • yyyy-MM-dd HH:mm:ss.SSSSSSSSS // 9'S'符号

实际上将.符号后面的整数解释为(接近10亿!)毫秒,而不是纳秒,导致日期

  • 2015-05-20 21:52:53 UTC

即超过11天.令人惊讶的是,使用较少数量的S符号仍会导致所有9位数被解析(而不是,例如,最左边的3位.SSS).

有两种方法可以正确处理此问题:

  • 使用字符串预处理
  • 使用自定义SimpleDateFormat实现

是否有任何其他方法可以通过向标准SimpleDateFormat实现提供模式来获得正确的解决方案,而无需任何其他代码修改或字符串操作?

java milliseconds simpledateformat

21
推荐指数
2
解决办法
2万
查看次数

IntelliJ代码完成不适用于新的Java类

IntelliJ IDEA 13已开始在我的本地设置中展示一种非常奇怪的行为.

也就是说,在Java添加到现有项目的任何新类中,Code Completion都不起作用.因此,在新类中声明任何类型的对象变量,然后键入该变量的名称,然后输入点(.)之后,不会对相应对象的任何方法提出建议.

例如,在声明之后

File f = new File("/home");
Run Code Online (Sandbox Code Playgroud)

键入f.不会显示File类中所有方法的列表,从中选择一个.事实上,当键入点(.)时,没有任何建议出现在IDE窗口的左下角(在状态栏中),消息"标识符预期.标识符预期".被展示.有时候,提出了一系列来自不相关组件或库的完全不相关的方法.

奇怪的是,Code Completion如果上述声明发生在任何现有类中,则按预期工作.

在机器重新启动,IDE重新启动,项目重新导入,关闭/重新打开或重建的许多组合之后,此行为仍然存在.

有任何想法吗?

java intellij-idea code-completion

18
推荐指数
6
解决办法
2万
查看次数

解析没有根元素的XML流

我需要解析连续的格式良好的XML元素流,我只给它一个已构造的java.io.Reader对象.这些元素不包含在根元素中,也不是像XML标题一样<?xml version="1.0"?>",而是有效的XML.

使用Java org.xml.sax.XMLReader类不起作用,因为XML Reader期望从封闭的根元素开始解析格式良好的XML.因此,它只读取流中的第一个元素,它将其视为根,并在下一个元素中失败,典型的

org.xml.sax.SAXParseException:根元素后面的文档中的标记必须格式正确.

对于不包含根元素的文件,但是这样的元素确实存在或者可以定义(并且被称为MyRootElement),可以执行以下操作:

        Strint path = <the full path to the file>;

        XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();

        StringBuilder buffer = new StringBuilder();

        buffer.append("<?xml version=\"1.0\"?>\n");
        buffer.append("<!DOCTYPE MyRootElement ");
        buffer.append("[<!ENTITY data SYSTEM \"file:///");
        buffer.append(path);
        buffer.append("\">]>\n");
        buffer.append("<MyRootElement xmlns:...>\n");
        buffer.append("&data;\n");
        buffer.append("</MyRootElement>\n");

        InputSource source = new InputSource(new StringReader(buffer.toString()));

        xmlReader.parse(source);
Run Code Online (Sandbox Code Playgroud)

我已经通过将部分java.io.Reader输出保存到文件来测试上述内容并且它可以工作.但是,这种方法在我的情况下不适用,并且无法插入此类额外信息(XML标头,根元素),因为java.io.Reader已经构造了传递给我的代码的对象.

基本上,我正在寻找"碎片式XML解析".所以,我的问题是,可以使用标准Java API(包括org.sax.xml.*java.xml.*包)来完成吗?

java xml sax xmlreader

17
推荐指数
3
解决办法
9495
查看次数

带有字符串分隔符的Java CSV解析器(多字符)

是否有任何Java开源库支持CSV的多字符(即长度> 1的字符串)分隔符(分隔符)?

根据定义,CSV =逗号分隔值数据,单个字符(',')作为分隔符.但是,存在许多其他单字符替代方案(例如,制表符),使CSV代表"字符分隔值"数据(本质上,DSV:分隔符分隔值数据).

用于CSV的主要Java开源库(例如,OpenCSV)几乎支持任何字符作为分隔符,但不支持字符串(多字符)分隔符.所以,对于用"|||"这样的字符串分隔的数据 除了预处理输入以便将字符串转换为单字符分隔符之外别无选择.从那时起,数据可以解析为单字符分隔值.

因此,如果有一个本地支持字符串分隔符的库,那将是很好的,因此不需要预处理.这意味着CSV现在标记为"CharSequence-Separated Values"数据.:-)

java csv delimiter separator

11
推荐指数
1
解决办法
2万
查看次数

Java中的CSV自动检测

如果CSV被重新定义为"字符分隔值",即使用任何单个字符(但通常是任何非字母数字符号)作为分隔符而不仅仅是逗号的数据,那么自动检测文件实际上是CSV的可靠方法是什么??

本质上,使用此(重新)定义,CSV = DSV("分隔符 - 分隔值"),例如,在本维基百科文章中讨论,而"逗号分隔值"格式在RFC 4180中定义.

更具体地说,是否存在一种统计推断数据具有某种"固定"长度的方法,意味着"可能的CSV"?仅计算分隔符的数量并不总是有效,因为每个记录都有可变数量字段的 CSV文件(即,与RFC 4180要求相反的记录,在同一文件中没有相同数量的字段).

CSV识别似乎是一个特别具有挑战性的问题,特别是如果检测不能基于文件扩展名(例如,当读取无论如何都没有这种信息的流时).

正确("完整")自动检测需要至少4个可靠的决策:

  1. 检测文件实际上是CSV
  2. 检测标头的存在
  3. 检测实际的分隔符
  4. 检测特殊字符(例如,引号)

由于其他数据集(例如,使用逗号的自由文本)的相似性,完全自动检测似乎没有单一的解决方案,特别是对于诸如可变长度记录,单引号或双引号字段或多行记录的转角情况.

因此,最佳方法似乎是望远镜检测,其中在应用CSV检测规则之前检查也可以归类为CSV的格式(例如,像Apache CLF这样的日志文件格式).

甚至像Excel这样的商业应用程序似乎依赖于文件扩展名(.csv)来决定(1),这显然不是自动检测,尽管如果应用程序被告知数据是CSV,问题会大大简化.

以下是一些讨论(2)和(3)的启发式的好相关文章:

(4)(引号的类型)的检测可以基于处理来自文件的几行并查找相应的值(例如,每行的偶数'或'将表示单引号或双引号).可以通过初始化现有的CSV解析器(例如,OpenCSV)来完成,该解析器将适当地关注CSV行分离(例如,多行事件).

但是(1),即首先确定数据是CSV呢?

莫非数据挖掘这一决定帮助吗?

java csv data-mining autodiscovery

10
推荐指数
1
解决办法
5368
查看次数

用于匹配转义字符的正则表达式(引号)

我想构建一个简单的正则表达式,涵盖引用的字符串,包括其中的任何转义引号.例如,

"This is valid"
"This is \" also \" valid"
Run Code Online (Sandbox Code Playgroud)

显然,像

"([^"]*)"
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它匹配第一个转义引用.

什么是正确的版本?

我想其他转义字符的答案是相同的(只需替换相应的字符).

顺便说一句,我知道"全能"正则表达式

"(.*?)"
Run Code Online (Sandbox Code Playgroud)

但我尽量避免使用它,因为毫不奇怪,它比一个更具体的运行速度慢一些.

java regex quotes escaping

9
推荐指数
2
解决办法
2万
查看次数

从多个Java字符串对象创建哈希

实现类似方法的最快和更强大(就唯一性而言)的方法是什么

public abstract String hash(String[] values);
Run Code Online (Sandbox Code Playgroud)

values[]阵列具有100到1,000个成员,每个成员具有几十个字符,并且该方法每次需要在不同的values[]阵列上运行大约10,000次/秒.

是应该使用StringBuilder缓冲区构建长字符串,然后在缓冲区内容上调用哈希方法,还是继续为每个字符串调用哈希方法values[]

显然,需要至少64位的散列(例如,MD5)来避免冲突,但是在相同的质量下,是否有更简单,更快的方法可以做到?

例如,怎么样

public String hash(String[] values)
{
    long result = 0;

    for (String v:values)
    {
        result += v.hashCode();
    }

    return String.valueOf(result);
}
Run Code Online (Sandbox Code Playgroud)

java hash md5 hashcode sha

9
推荐指数
3
解决办法
1万
查看次数

如何将多个源文件夹添加到JAR?

我有一个来自库的大型JAR文件,其源代码分散在多个不同的文件夹中,因此我必须手动合并这些文件夹并指定单个合并文件夹作为源.

Eclipse中有没有办法将多个源文件夹链接到特定的JAR?我猜不是,我试过的各种技巧似乎不起作用,但如果有人知道一个有效,请发布.

java eclipse jar build

8
推荐指数
1
解决办法
2440
查看次数

Java 6中对ISO 8601格式的通用支持

Java 7 SimpleDateFormat通过字符X(而不是大写或小写Z)在ISO 8601格式的类中引入了支持.在Java 6中支持这样的格式需要预处理,因此最好的方法是问题.

这种新格式是Z(大写Z)的超集,另外还有两种变体:

  1. "分钟"字段是可选的(即,2位而不是4位时区有效)
  2. 冒号字符(':')可用于将2位"小时"字段与2位"分钟"字段分开.

因此,正如人们可以从Java 7文档中SimpleDateFormat看到的那样,以下3种格式现在是有效的(而不仅仅是ZJava 6中涵盖的第二种格式),当然,等效:

  1. -08
  2. -0800
  3. -08:00

正如之前关于支持这种"扩展"时区格式的特殊情况的问题所讨论的那样,始终使用':'作为分隔符,将Java 7功能向后移植到Java 6中的最佳方法是将类子SimpleDateformat类化并覆盖其parse()方法,即:

public Date parse(String date, ParsePosition pos)
{
    String iso = ... // Replace the X with a Z timezone string, using a regex

    if (iso.length() == date.length())
    {
        return null; // Not an ISO 8601 date
    }

    Date parsed …
Run Code Online (Sandbox Code Playgroud)

java regex date simpledateformat java-6

8
推荐指数
2
解决办法
8442
查看次数