如何确定如果一个字符串模式吗?

4视图(30天)
你好,
我有一组字符串和我想分类成不同的功能。
让我们考虑下面的字符串:
setStrings {1} =“2 * x + 3”;
setStrings {2} =“2 * exp (3 / x)”
setStrings {3} =“sin (x)”
和下面的功能:
func1 = @ * x + B (x)
func2 = @ (x) * exp (- b / x)
我们如何检查setStrings{1}和setStrings{2},分别func1和func2的形式?以及如何发现setStrings{3}不遵循availabla函数的形式吗?
最后,是一种简化的字符串里面有几个乘法?例如:
“10 * exp (3 / x) * 1/5”- >“2 * exp (3 / x)”
提前感谢你的帮助。

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2022年11月4日
setStrings {1} =“2 * x + 3”;
setStrings {2} =“2 * exp (3 / x)”;
setStrings {3} =“2 * x - 3”;
setStrings {4} =“2 * exp (3 / x)”;
setStrings {5} =“sin (x)”
setStrings =1×5单元阵列
{' 2 * x + 3 '} {2 * exp (3 / x)的}{' 2 * x - 3 '} {2 * exp (3 / x)的}{}“sin (x)”
first_kind = regexp (setStrings,”(< >——? \ d +) \ \ s * * \ s * x \ s * (? < B > (+ -) \ s * \ d +)”,“名字”)
first_kind =1×5单元阵列
{1×1 struct} {0×0 struct} {1×1 struct} {0×0 struct} {0×0 struct}
first_results = arrayfun (@ (S) structfun (@str2num,年代,“统一”,0),vertcat (first_kind {:}))
first_results =2×1结构体数组字段:
一个B
second_kind = regexp (setStrings,“(< >——? \ s * \ d +) \ s * \ * \ s * exp \ ((? < negB > (+ -) ? \ s * \ d +) \ s * / \ s * x \ s * \)”,“名字”)
second_kind =1×5单元阵列
{0×0 struct} {1×1 struct} {0×0 struct} {1×1 struct} {0×0 struct}
second_results = arrayfun (@ (S) structfun (@str2double,年代,“统一”,0),vertcat (second_kind {:}))
second_results =2×1结构体数组字段:
一个negB
你可能想要创建B = -negB。
你表达的方式,你会感兴趣的3 / x得到+ 3的值。但我编码常数有积极的可能性,如exp (4 / x)和在你的条款,必须解析的exp (- (4) / x)——也就是说,作为实验的情况下(- B / x)和B是4
表达式得到明显的混乱,如果你允许浮点数。混乱的一部分正在处理所有的可能性等 4 vs 4所示。 vs 4.2 vs 0.2 vs 。2 vs 4 e - 3 vs 4 e + 3 vs 4 e3 vs 4 e + 3 vs .4e3 …但禁止只是普通 + 3。 。表情变得不那么混乱,如果你说,总会有至少一个十进制数字之前,如果有一段时期。
4评论
沃尔特·罗伯森
沃尔特·罗伯森 2022年11月9日
每次你有 * 在模式(这不是 \ * ),那么这就意味着“去尽可能匹配同样的模式。
后如果有任何模式的正则表达式,然后正则表达式()看起来是否可以匹配第二个模式的第一个模式不再匹配,如果然后继续处理,与该模式匹配就其本身而言,如果它有一个 * 在里面。这个序列尽可能每个 * 继续(也就是这样,如果你使用{}计数修饰符指定无限期数。)
最终你会发现你在输入字符串的结束,你还在一个地方输入模式列表中没有发生进一步的输入…在这种情况下,每个人都快乐,一切都是在相同的顺序排放。
但当你有一个 * 修饰符,你有不止一个正则表达式模式,通常发现你已经达到了在输入点 下一个模式匹配表达式。当这种情况发生时,匹配器向后一个可选的重复,并检查是否可以前进的匹配。如果不工作,它会向后的重复,并再次尝试。这个过程,最终解除长序列的模式和最终使用完全不同的分支比以往使用的模式。但尽量解除不放松:解除停在第一个点,你可以成功匹配整个余下的模式。
当你有可选的部分模式,这可能最终在“显然”的情况有一个特定的子表达式匹配,但是有一些可选组件,和解除过程能够满足剩余的表达式通过假设中间组件是空的。
你的表情
(\ * \ s * x \ s * \ ^ \ s *) ?
它允许* x ^组件是可选的。但它也有
(? < B > (+ -) ? \ d + \ ? \ d *) ?
它允许B组件是可选的。有效的可能性是他们中的一个 这两个 缺席。当你“备份”这一点上,你并不一定要匹配,你认为你应该。
这就是为什么有时你可能看到表情编码为(A | | AB),而不是作为一个? ?——当你看到一个看似redundent名单的可能性,那么它可能是消除所有的部分匹配的可能性。
我没有追到找到确切的失败,允许A和C是匹配但不是B,但看起来我你不够严格,至少坚持一个匹配的可能性。

登录置评。

答案(1)

马特·J
马特·J 2022年11月4日
编辑:马特·J 2022年11月4日
最后,是一种简化的字符串里面有几个乘法?
如果你有符号数学工具箱
信谊x
简化(10 * exp (3 / x) * 1/5)
ans =
我们如何检查setStrings{1}和setStrings{2},分别func1和func2的形式?以及如何发现setStrings{3}不遵循availabla函数的形式吗?
你可以通过曲线拟合每个setStrings每个模型和拟合误差评估。根据各种可能setStrings你可以做以下,
setStrings {1} =“2 * x + 3”;
setStrings {2} =“2 * exp (3 / x)”;
setStrings {3} =“sin (x)”;
N =元素个数(setStrings);
spl0 = {“一个”,“B”,};
i = 1: N
spl =分裂(setStrings {}, digitsPattern) ';
如果元素个数(spl) ~ = 3,
setStrings{我}=“未分类”;
其他的
setStrings{我}= strjoin ((spl; spl0),);
结束
结束
setStrings
setStrings =1×3单元阵列
{* x + B”} {“* exp (- B / x)”}{“未分类”}
(tf, loc) = ismember (setStrings, {“* x + B”;“* exp (- b / x)”})
tf =1×3逻辑数组
1 1 0
loc = 1×3
1 2 0
1评论
玛丽
玛丽 2022年11月4日
谢谢你!你的解决方案完全工作。

登录置评。

类别

找到更多的在数据类型转换帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!