Java 中的拆分波斯语日期数字形成单词

Split Persian Date Numbers Form Words in Java

我想java. 中的 stick words 拆分波斯日期数字 我的字符串是这样的:“01/07/1395سعید”

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

我想达到类似“01/07/1395 سعید”的目的

这是我的解决方案。它会根据您的要求将 spaces 添加到字符串中。在我的 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,还有 Arabic/Persian 数字、梵文数字等等。
  • 表达式\p{IsAlphabetic}匹配任何字母表中的一个字母;所以不仅是 A-Z 和 a-z,还有 Arabic/Persian 字母表和其他字母表。
  • 当您在正则表达式中看到 (?<=X) 时,这意味着您要查找的匹配项必须 之前有匹配 X 的内容,但 X 的匹配项不会成为您找到的匹配项的一部分。这称为 "lookbehind",因为它表示 "look behind what you're matching, and see if it's X"。
  • 当您在正则表达式中看到 (?=X) 时,这意味着您要查找的匹配项必须 后跟 匹配 X 的内容,但 X 的匹配项不会成为您找到的匹配项的一部分。这称为 "lookahead",因为它表示 "look ahead of what you're matching, and see if it's X"。

综上所述,我在代码中包含了两个正则表达式,即 BETWEEN_NUMBER_AND_LETTERBETWEEN_LETTER_AND_NUMBER。其中每一个都不匹配任何内容,因为它们不包含实际匹配任何内容的字符。但每个人都有回顾和展望。所以 BETWEEN_NUMBER_AND_LETTER 匹配 "nothing at all" 前面有一个数字,后面有一个字母; BETWEEN_LETTER_AND_NUMBER 匹配 "nothing at all" 前面有一个字母,后面有一个数字。

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

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