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_LETTER
和 BETWEEN_LETTER_AND_NUMBER
。其中每一个都不匹配任何内容,因为它们不包含实际匹配任何内容的字符。但每个人都有回顾和展望。所以 BETWEEN_NUMBER_AND_LETTER
匹配 "nothing at all" 前面有一个数字,后面有一个字母; BETWEEN_LETTER_AND_NUMBER
匹配 "nothing at all" 前面有一个字母,后面有一个数字。
您需要做的是用 space 替换其中任何一个空值,因为这会将任何字母与任何数字分开,前提是它们是原始 String
中的连续字符。这就是我的 addSpaces
方法所做的 - 它首先在 String
中的任何一点放置一个 space ,其中有一个数字紧跟一个字母,然后它放置一个 space在任何一个字母后面紧跟着一个数字的地方。
我的测试用例在 main
中证明这正是您所需要的。
我想从 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'sX
"。 - 当您在正则表达式中看到
(?=X)
时,这意味着您要查找的匹配项必须 后跟 匹配X
的内容,但X
的匹配项不会成为您找到的匹配项的一部分。这称为 "lookahead",因为它表示 "look ahead of what you're matching, and see if it'sX
"。
综上所述,我在代码中包含了两个正则表达式,即 BETWEEN_NUMBER_AND_LETTER
和 BETWEEN_LETTER_AND_NUMBER
。其中每一个都不匹配任何内容,因为它们不包含实际匹配任何内容的字符。但每个人都有回顾和展望。所以 BETWEEN_NUMBER_AND_LETTER
匹配 "nothing at all" 前面有一个数字,后面有一个字母; BETWEEN_LETTER_AND_NUMBER
匹配 "nothing at all" 前面有一个字母,后面有一个数字。
您需要做的是用 space 替换其中任何一个空值,因为这会将任何字母与任何数字分开,前提是它们是原始 String
中的连续字符。这就是我的 addSpaces
方法所做的 - 它首先在 String
中的任何一点放置一个 space ,其中有一个数字紧跟一个字母,然后它放置一个 space在任何一个字母后面紧跟着一个数字的地方。
我的测试用例在 main
中证明这正是您所需要的。