用Java分割波斯日期数字形式单词

时间:2017-08-01 12:09:33

标签: java regex date numbers words

我想在 java 从粘贴词中分割波斯日期编号 我的字符串就像:“01/07 / 1395سعید”

我搜索太多,但我找不到合适的,对我有用!! 此外,日期格式可能完全错误,其重要将字与数字分开。

我希望达到像“01/07/1395سعید”

这样的东西

1 个答案:

答案 0 :(得分:1)

这是我的解决方案。它会根据您的请求为String添加空格。在我的main方法中,我将سعید۰۱/۰۷/۱۳۹۵سعید作为输入,并在控制台上打印سعید ۰۱/۰۷/۱۳۹۵ سعید

public class StringPadder {

    private static final String BETWEEN_NUMBER_AND_LETTER = "(?<=\\p{IsDigit})(?=\\p{IsAlphabetic})";
    private static final String BETWEEN_LETTER_AND_NUMBER = "(?<=\\p{IsAlphabetic})(?=\\p{IsDigit})";

    public static String addSpaces(String toPad) {
        return toPad.replaceAll(BETWEEN_NUMBER_AND_LETTER, " ").replaceAll(BETWEEN_LETTER_AND_NUMBER, " ");
    }

    public static void main(String[] args) {
        String toTest =  "سعید۰۱/۰۷/۱۳۹۵سعید";
        System.out.println(addSpaces(toTest));

    }
}

这可以通过一些正则表达式技巧来实现。

  • 表达式\p{IsDigit}任何字母表中的数字匹配;所以不只是0-9,还有阿拉伯语/波斯语数字,梵文数字等等。
  • 表达式\p{IsAlphabetic}任何字母表中的字母匹配;所以不只是A-Z和a-z,还有阿拉伯语/波斯语字母和其他字母。
  • 当您在正则表达式中看到(?<=X)时,表示您正在寻找的匹配必须之前匹配X,但是匹配X不会成为您找到的匹配项的一部分。这被称为&#34; lookbehind&#34;,因为它表示&#34;查看您匹配的内容,并查看它是否X&#34;。
  • 当您在正则表达式中看到(?=X)时,表示您要查找的匹配必须跟随匹配X的匹配项,但是匹配X不会成为您找到的匹配项的一部分。这被称为&#34; lookahead&#34;,因为它表示&#34;展望您正在匹配的内容,并查看它是否X&#34;。

将所有这些放在一起,我在代码中包含了两个正则表达式,即BETWEEN_NUMBER_AND_LETTERBETWEEN_LETTER_AND_NUMBER。这些中的每一个都没有任何匹配,因为它们不包含实际匹配任何内容的字符。但每个人都有一个后视和前瞻。所以BETWEEN_NUMBER_AND_LETTER匹配&#34;什么都没有&#34;前面有一个数字,后面有一个字母;和BETWEEN_LETTER_AND_NUMBER匹配&#34;什么都没有&#34;前面有一封信,后面有一个数字。

您需要做的是用空格替换其中任何一个,因为它会将任何数字与任何数字分开,前提是它们是原始String中的连续字符。这就是我的addSpaces方法所做的事情 - 它首先在String中的任意位置放置一个空格,其中有一个数字后面跟着一个字母,然后它在任何点放置一个空格有一封信后紧跟一个号码。

我在main中的测试用例表明这正是您所需要的。