我想在 java 中从粘贴词中分割波斯日期编号。 我的字符串就像:“01/07 / 1395سعید”
我搜索太多,但我找不到合适的,对我有用!! 此外,日期格式可能完全错误,其重要将字与数字分开。
我希望达到像“01/07/1395سعید”
这样的东西答案 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)
时,表示您正在寻找的匹配必须在之前1>匹配X
,但是匹配X
不会成为您找到的匹配项的一部分。这被称为&#34; lookbehind&#34;,因为它表示&#34;查看您匹配的内容,并查看它是否X
&#34;。 (?=X)
时,表示您要查找的匹配必须跟随匹配X
的匹配项,但是匹配X
不会成为您找到的匹配项的一部分。这被称为&#34; lookahead&#34;,因为它表示&#34;展望您正在匹配的内容,并查看它是否X
&#34;。 将所有这些放在一起,我在代码中包含了两个正则表达式,即BETWEEN_NUMBER_AND_LETTER
和BETWEEN_LETTER_AND_NUMBER
。这些中的每一个都没有任何匹配,因为它们不包含实际匹配任何内容的字符。但每个人都有一个后视和前瞻。所以BETWEEN_NUMBER_AND_LETTER
匹配&#34;什么都没有&#34;前面有一个数字,后面有一个字母;和BETWEEN_LETTER_AND_NUMBER
匹配&#34;什么都没有&#34;前面有一封信,后面有一个数字。
您需要做的是用空格替换其中任何一个,因为它会将任何数字与任何数字分开,前提是它们是原始String
中的连续字符。这就是我的addSpaces
方法所做的事情 - 它首先在String
中的任意位置放置一个空格,其中有一个数字后面跟着一个字母,然后它在任何点放置一个空格有一封信后紧跟一个号码。
我在main
中的测试用例表明这正是您所需要的。