0

我正在尝试根据一些简单的语法概念用正则表达式替换/匹配。已经很晚了,我以通常的信心接近了正则表达式网站,相信我可以在一个晚上学会这件事。我大约每六个月这样做一次。是的,我很愚蠢。

无论如何,以防万一这个时间有任何接受者(或确实在整个池塘)有人可以给我一个支持一些简单语法规则的正则表达式:

  • 逗号 (,) 句点 (.) 和单引号 (') 前面不能有 1 个或多个空格。
  • 逗号 (,) 句点 (.) 后面总是跟一个空格(不多也不少)。
  • 逗号 (,) 句点 (.) 和空格 ( ) 永远不会重复超过一次。
  • 一对中的第一个双引号 (") 后面永远不会跟一个或多个空格,而最后一个总是一个空格或句点 (.) 字符。
  • 最后一个双引号之前不应有任何空格 ()。

一些一般性的解释肯定会得到支持,因为我相信这将有助于我寻求对正则表达式的理解。

很抱歉抑制了情绪,但我正在使用 Actionscript 3 来实现这一点。不确定它利用的是哪个正则表达式引擎,但毫无疑问它会有一些怪癖。不过,在您习惯的任何正则表达式实现中都值得一试。

这是一个视觉效果:

// string before

var string:String = '" Hello ,my name is Shennan ,, "he said  .  ';

string = string.replace(/* your regex magic */, /* replace with */);

trace(string); /* output: "Hello, my name is Shennan," he said. */
4

2 回答 2

3

这处理逗号和句点前后的空格:

var pattern:RegExp = / *([,.]) */g;
string.replace(pattern, "$1 ");

这处理单引号前的空格:

var pattern:RegExp = / *'/g;
string.replace(pattern, "'");

这可以处理重复的逗号、句点和单引号:

var pattern:RegExp = /([,.'])\1*/g;
string.replace(pattern, "$1");

没有简单的方法来处理成对的引号,因为例如,被分成段落的引用材料(例如演讲)经常重新打开引号而不关闭前面段落中的引号。当且仅当保证引号均匀配对时,您可以使用:

var pattern:RegExp = /" *([^"]*)"/g;
string.replace(pattern, '"$1"');

 

var pattern:RegExp = /("[^"]*")(?![. ])/g;
string.replace(pattern, '$1 ');

Actionscript 3 支持反向引用以及负前瞻,因此上述所有方法都应该有效,但我承认我还没有测试过它们(但是,因为我需要用完)。

于 2013-07-15T23:23:05.217 回答
3

我已根据您的规则将该过程分解为一系列正则表达式替换。没有测试过这些,但与 acheong87 的答案相比,它们对我来说很合适:

--

规则 1:逗号 (,) 句点 (.) 和单引号 (') 前面不能有 1 个或多个空格。

很简单,只需匹配一个或多个空格 ( \s+),后跟逗号、句点或单引号 ( [,.'])。使用括号 ( ) 捕获逗号、句点或单引号,()以便您可以在替换中使用它$1

var pattern:RegExp = /\s+([.,'])/g;
string.replace(pattern, '$1');

--

规则 2:逗号 (,) 句点 (.) 后面总是跟一个空格(不多也不少)。

让我们把它分成两个正则表达式。首先,匹配一个逗号或句点 ( [,.]) 后跟一个或多个空格 ( \s+) 并将这些空格替换为一个空格:

var pattern:RegExp = /([.,])\s+)/g;
string.replace(pattern, '$1 ');

然后,匹配一个逗号或句点,后跟任何不是空格 ( \S) 的内容——这里我使用负前瞻来执行此操作,但还有其他方法——并将其替换为逗号或句点后跟一个空格:

var pattern:RegExp = /([.,])(?!\s)/g;
string.replace(pattern, '$1 ');

--

规则 3:逗号 (,) 句点 (.) 和空格 ( ) 永远不会重复超过一次。

很简单:

var pattern:RegExp = /([,.\s])+/g;
string.replace(pattern, '$1');

--

规则 4 + 5:一对中的第一个双引号 (") 后面永远不会有一个或多个空格,最后一个总是后跟一个空格或句点 (.) 字符。最后一个双引号不应有任何空格( ) 在它之前。

就像acheong87 说​​的,这有点棘手。假设您只有成对的引号,您可以使用以下规则:

var pattern:RegExp = /"\s*([^"]*)"/g;
string.replace(pattern, '"$1"');

var pattern2:RegExp = /"([^"]*)\s*"(?![.\s])/g;
string.replace(pattern2, '"$1".');

这假设您要在任何结束报价后添加一个句点,而该句点后面没有空格或句点。'"$1" '如果您想在这种情况下使用空格,您可以将最后一个参数更改为。


如果您愿意,可以大大简化这些规则。例如,如果您首先应用规则 3正则表达式,则无需考虑其他规则中的重复空格。这意味着您不需要规则 2中的第一个正则表达式,而只需使用第二个。

另外,请参阅 acheong87 的出色答案以获取一些不错的示例。

于 2013-07-15T23:40:22.140 回答