我正在尝试根据一些简单的语法概念替换/匹配正则表达式。现在已经很晚了,我接近正规表达网站的时候,我常常相信我能在晚上得到这些东西。我大约每六个月做一次。是的,我很愚蠢。
无论如何,为了防止在这个时间(或者确实在整个池塘)有任何人,有人可以给我一个正则表达式,坚持一些简单的语法规则:
一些一般性的解释肯定会保证一个upvote,因为我相信这将有助于我寻求正则表达式的理解。
很抱歉让我心情不好但我正在使用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. */
答案 0 :(得分: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支持反向引用和负向前瞻,所以上述所有内容都应该有效,但不可否认我还没有对它们进行过测试(但是,因为我需要耗尽)。
答案 1 :(得分:3)
我已根据您的规则将该过程分解为一系列正则表达式替换。没有测试这些,但与acheong87的答案相比,他们看起来对我来说:
-
规则1:逗号(,)句点(。)和单引号(')前面永远不会有1个或多个空格。
简单,只需匹配一个或多个空格(\s+
),然后是逗号,句号或单引号([,.']
)。使用parens(()
)捕获逗号,句号或单引号,以便您可以将其替换为$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:一对中的第一个双引号(“)后面跟不上一个或多个空格,最后一个后跟一个空格或一个句点(。)字符。最后一个quote之前不应该有任何空格()。
就像acheong87所说,这有点棘手。假设您只有配对引号,则可以使用以下规则:
var pattern:RegExp = /"\s*([^"]*)"/g;
string.replace(pattern, '"$1"');
var pattern2:RegExp = /"([^"]*)\s*"(?![.\s])/g;
string.replace(pattern2, '"$1".');
这假设您要在任何未跟随空格或句点的结束引号之后添加句点。如果你想在这种情况下使用空格,你可以将最后一个参数改为'"$1" '
。
如果您愿意,可以大大简化这些规则。例如,如果您首先应用规则3 正则表达式,则无需考虑其他规则中的重复空格。这意味着您不需要规则2 中的第一个正则表达式,并且可以使用第二个正则表达式。
另外,请参阅acheong87的一些很好的例子。