如何使用正则表达式分割数字和字符?

4

我有一个包含工作日和营业时间的字符串,如何使用正则表达式将其拆分成行?以下是一个字符串示例:

Mån - Tor6:30 - 22:00Fre6:30 - 20:00Lör9:00 - 18:00Sön10:00 - 19:00

我想在小写字母和数字之间以及数字和大写字母之间进行拆分。
Mån - Tor  
6:30 - 22:00  
Fre  
6:30 - 20:00  
Lör  
9:00 - 18:00  
Sön  
10:00 - 19:00 

提前感谢您!


1
什么语言?Python,Ruby,SED? - Peter
有人可以帮忙格式化他的代码吗? - jordanbtucker
4个回答

9

拆分

(?<=\d)(?=\p{L})|(?<=\p{L})(?=\d)

例如,在C#中:
splitArray = Regex.Split(subjectString, @"(?<=\d)(?=\p{L})|(?<=\p{L})(?=\d)");

或者在PHP中:

$result = preg_split('/(?<=\d)(?=\p{L})|(?<=\p{L})(?=\d)/u', $subject);

或者在Java中:

String[] splitArray = subjectString.split("(?<=\\d)(?=\\p{L})|(?<=\\p{L})(?=\\d)");

或者在Perl中:
@result = split(m/(?<=\d)(?=\p{L})|(?<=\p{L})(?=\d)/, $subject);

谢谢!这个能用!我不知道编程语言很重要。我以为正则表达式在任何语言中都是一样的。不管怎样,这个是Java。我先试了一下正则表达式模式类,但那个没用,但你写的这行代码可以用!谢谢。 - Magnus
@Magnus:不同的正则表达式语言之间存在语法差异、特性差异和实现差异,因此没有两个正则表达式是完全相同的。比如上面那个正则表达式在 Python 中无法使用,因为它没有 Unicode 属性并且无法在零长度匹配上进行分割;在 JavaScript 中也是同样的情况——它没有向后查找。顺便提一下,你可以使用 \p{N} 来替换 \d 以保持一致性。 - Tim Pietzcker
谢谢!你有什么想法在哪里可以学习更多关于正则表达式的知识吗?六个小时前我还不知道它是什么,但现在我能看到它的潜力 :-) - Magnus
@Magnus: 鉴于这是Java语言,蒂姆如此保守地撰写代码是非常好的事情。这样才能确保代码正常运行。:( - tchrist

3

只有当一个数字具有\pN属性时,非数字才是缺乏该属性的任何代码点,这可以用\PN来表示。

一些正则表达式方言坚持采用\p{N}\P{N}来表示这些,这是不正确的,但你受制于你的语言设计者的怪癖、不安全因素或无知。

在那些更易读的正则表达式方言中,你可以以更自由和更易读的方式编写它们,分别为\p{Number}\P{Number}

如果你指的是十进制数,它与数字不同,你可以将其写为\p{Nd},因此它的补集为\P{Nd}。这些的易读版本是\p{Decimal_Number}\P{Decimal_Number}。在一些编程语言中,这就是\d正则表达式方便缩写所代表的含义。

与数字相关的有四个一般类别:

       N           Number
       Nd          Decimal_Number (also Digit)
       Nl          Letter_Number
       No          Other_Number

还有许多与数字相关的其他类别:

    字母数字字符                                    印度数字形式                                数字类型:数字                       数值:18                         数值:38                         数值:400                        数值:60000
    右至左类别:阿拉伯数字                        竹简数字                                 数值:0                          数值:19                         数值:39                         数值:500                        数值:70000
    右至左类别:欧洲数字                      楔形文字数字和标点符号                        数值:NaN                        数值:20                         数值:40                         数值:600                        数值:80000
    区块:爱琴海数字                           封闭字母数字                             数值:1                          数值:21                         数值:41                         数值:700                        数值:90000
    区块:古希腊数字                       封闭字母数字补充                           数值:2                          数值:22                         数值:42                         数值:800                        数值:100000
    区块:常用印度数字形式                   数学字母数字符号                            数值:3                          数值:23                         数值:43                         数值:900                        数值:100000000
    区块:计数棒数字                      数字形式                               数值:4                          数值:24                         数值:44                         数值:1000                       数字
    区块:楔形文字数字和标点符号          鲁米数字符号                             数值:5                          数值:25                         数值:45                         数值:2000                       其他数字
    区块:封闭字母数字补充                字母数字                               数值:6                          数值:26                         数值:46                         数值:3000                       PosixAlnum
    区块:封闭字母数字                  断词线:中缀数字                           数值:7                          数值:27                         数值:47                         数值:4000                       句子断点:数字
    区块:数学字母数字符号               断词线:数字                             数值:8                          数值:28                         数值:48                         数值:5000                       单词断点:扩展数字字母
    区块:数字形式                     断词线:后缀数字                           数值:9                          数值:29                         数值:49                         数值:6000                       单词断点:中间数字
    区块:鲁米数字符号                 断词线:前缀数字                           数值:10                         数值:30                         数值:50                         数值:7000                       单词断点:中间数字字母
    十进制数字                           数字                                   数值:11                         数值:31                         数值:60                         数值:8000                       单词断点:数字
    通用类别:十进制数字                    数字类型:十进制                        数值:12                         数值:32                         数值:70                         数值:9000                       XPosixAlnum
    通用类别:字母数字                      数字类型:十进制数字                     数值:13                         数值:33                         数值:80                         数值:10000                      
    通用类别:数字                        数字类型:数位                          数值:14                         数值:34                         数值:90                         数值:20000                      
    通用类别:其他数字                    数字类型:数字                          数值:15                         数值:35                         数值:100                        数值:30000                      
    爱琴海数字                              数字类型:无                            数值:16                         数值:36                         数值:200                        数值:40000                      
    古希腊数字                            数字类型:Nu                           数值:17                         数值:37                         数值:300                        数值:50000       
所以,您对哪种特定类型的“数字”感兴趣呢? :)

1
+1 用“胆小如鼠”来描述正则表达式方言。 - James

1

0
如果你搜索 ([a-z])(\d) 并将其替换为 $1\n$2,它应该可以工作。但是,由于不知道你的编程语言和环境,很难直接给出答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接