[英]Regex for basic grammar formatting
我试图用基于一些简单语法概念的正则表达式替换/匹配。 很晚了,我以通常的信心访问了正则表达式网站,相信我可以在一个晚上学会这件事。 我大约每六个月这样做一次。 是的,我很傻。
无论如何,以防万一此时(或确实在池塘对面)有人接受,有人可以给我一个支持一些简单语法规则的正则表达式:
一些一般性的解释肯定会得到赞成,因为我相信这将有助于我对正则表达式的理解。
很抱歉抑制了情绪,但我正在使用 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. */
这处理逗号和句点前后的空格:
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 支持反向引用以及负前瞻,因此上述所有内容都应该可以工作,但不可否认,我还没有测试它们(但是,因为我需要用完)。
我已根据您的规则将该过程分解为一系列正则表达式替换。 还没有测试过这些,但与 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 的一些很好的例子的很好的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.