regex 正则表达式检查字符串是否包含除允许的单词以外的任何内容

kupeojn6  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(85)

我想检查一个字符串是否包含一些预定义的单词以外的任何单词。预定义的单词是What is,plus,minus,multiplied by,divided by,一些短语中包含单个空格。我读过this postthis one,它们都使用了负面的lookaheads,但无法想出一个有效的模式。
例如,输入文本“What is plus abc divided by”应返回为“abc”未被识别。
对于这个问题,正确的正则表达式是什么?

编辑:

请注意,我不关心无效令牌是什么,只关心它的存在。它可以是任何东西,一个字或一个数字。该问题也可以被认为是“检查输入是否仅包含允许的单词”。

ux6nzvsh

ux6nzvsh1#

把他们加入一个小组:

(?:What is|plus|minus|multiplied by|divided by)

请注意,如果您有multiplymultiply by(即一个令牌以另一个令牌开始),multiply by * 必须 * 首先出现:

(?:What is|plus|minus|multiply by|multiply)

要检查字符串是否只包含有效的令牌,请用途:

^                  # Match at the start of string
\g<token>          # a pre-defined token
(?:\s+\g<token>)*  # followed by 0 or more tokens
$                  # right before the end of string.

...其中\g<token>表示上述表达式。
试试on regex101.com

原始答案

由于我们还需要找到(第一个)无效的令牌,因此您需要匹配每个非空白条纹,并将上面的表达式不匹配的那些存储在一个组中:

(?:What is|plus|minus|multiplied by|divided by)|(\S+)

如果匹配项包含组1,则意味着它是未识别的令牌。相应地输出错误。
试试on regex101.com

icomxhvb

icomxhvb2#

  • "...检查输入是否只包含允许的单词”。*

然后,您必须检查结果,以查看是否允许非指定值。

What is +(.+?) +(?:plus|minus) +(.+?) +(?:(?:multiplied|divided) by) +(.+)

或者,指定值。在这种情况下,它最有可能只是数字。

What is +(\d+) +(?:plus|minus) +(\d+) +(?:(?:multiplied|divided) by) +(\d+)

示例

What is 1 plus 2 divided by 3

输出为1、2和3。
并且,最终允许分数值。

What is +(\d+(?:\.\d+)?) +(?:plus|minus) +(\d+(?:\.\d+)?) +(?:(?:multiplied|divided) by) +(\d+(?:\.\d+)?)
What is 1.23 plus 2.3 divided by 3
svgewumm

svgewumm3#

使用消极的前瞻来尝试匹配整个输入,* 不是 * 由允许的短语组成:

^(?!((^| )(What is|plus|minus|multiplied by|divided by)( |$))+$).*

参见live demo

相关问题