1

所以我一直在做一个小项目,为游戏的脚本语言编写语法荧光笔。这一切都顺利进行,除了一个部分:数字。

以这些行为例

(5:42) Set database entry {healthpoints2} to the value 100.

(5:140) Move the user to position (29,40) on the map.

我想在最后突出显示 100,而不突出显示大括号中的 (5:42) 或 2。数字不会总是在同一个地方,也不会总是只有一个数字。

我基本上需要一个正则表达式来表示:

“匹配任何不在 {} 之间且不匹配 (#:#) 模式的数字。”

我已经做了一天半了,我正在拔头发试图弄清楚。对此的帮助将不胜感激!我已经查看了regular-expressions.info,并尝试使用RegexBuddy,但我就是不明白:c

编辑:根据要求,这里有一些直接从脚本编辑器复制的行。

(0:7) When somebody moves into position (**10** fhejwkfhwjekf **20**,

(0:20) When somebody rolls exactly **10** on **2** dice of **6** sides,

(0:31) When somebody says {...},

(3:3) within the diamond (**5**,**10**) - **20** //// **25**,

(3:14) in a line starting at (#, #) and going # more spaces northeast.

(5:10) play sound # to everyone who can see (#,#).

(5:14) move the user to (#,#) if there's nobody already there.

(5:272) set message ~msg to be the portion of message ~msg from position # to position #.

(5:302) take variable %var and add # to it.

(5:600) set database entry {...} about the user to #.

(5:601) set database entry {...} about the user named {...} to #.

4

2 回答 2

1

当你看到这个解决方案时,你可能会踢自己......

假设这个期望的数字总是在一个句子中使用,它应该总是在它前面有一个空格。

$pattern = '/ [0-9]+/s';

如果前面的空格并不总是存在,请告诉我,我会更新答案。


这是更新的正则表达式,以匹配您问题中的 2 个示例:

$pattern = '/[^:{}0-9]([0-9,]+)[^:{}0-9]/s';

第三次更新以说明您的问题修订:

$pattern = '/[^:{}0-9a-z#]([0-9]+[, ]?[0-9]*)[^:{}0-9a-z#]/s';

所以你不要在诸如此类的事情中突出显示数字

{更新 29 测试}

您可能想要预先剥离大括号,如下所示:

$pattern = '/[^:{}0-9a-z#]([0-9]+[, ]?[0-9]*)[^:{}0-9a-z#]/s';
$str = '(0:7) Hello {update 29 testing} 123 Rodger alpha charlie 99';
$tmp_str = preg_replace('/{[^}]+}/s', '', $str);
preg_match($pattern, $tmp_str, $matches);
于 2012-04-24T22:15:39.290 回答
0
(\d+,\s?\d+)|(?<![\(\{:]|:\d)\d+(?![\)\}])

http://regexr.com?30omd

这行得通吗?

于 2012-04-24T22:29:27.327 回答