uCalc API Version: 2.1.3-preview.2 Released: 6/16/2026
Warning
uCalc API Preview Release Notice:The documentation describes the intended behavior of the API. The current preview build contains incomplete features, unoptimized performance, and is subject to breaking changes.
DefaultRuleSet = [Rule]
Property
Product:
Class:
Gets a special Rule object that acts as a template, defining the default properties for all new rules created in this Transformer.
Remarks
⚙️ The Default Rule Set: A Template for Consistency
The DefaultRuleSet property provides access to a special Rule object that is not used for matching text itself. Instead, it acts as a prototype or template for all new rules created within its parent Transformer. This is a powerful feature for establishing consistent behavior and reducing boilerplate code.
How It Works
When you create a new rule using FromTo() or Pattern(), the new Rule object starts with a copy of all the property settings from DefaultRuleSet. You can then override these defaults on a per-rule basis.
// Set a default for all rules in this transformert.DefaultRuleSet.CaseSensitive = true;// This rule will now be case-sensitive by defaultvar rule1 = t.FromTo("HELLO", "HI");// You can still override it for a specific rulevar rule2 = t.FromTo("world", "there").SetCaseSensitive(false);Commonly Configured Properties
This is the ideal place to configure behavior that should apply to most or all rules in a transformer:
- CaseSensitive: Determines if patterns are case-sensitive.
- WhitespaceSensitive: Controls whether whitespace is significant.
- StatementSensitive: Determines if newlines and semicolons act as boundaries.
- QuoteSensitive: Controls whether quoted text is treated as an atomic unit.
- BracketSensitive: Enables awareness of nested parentheses and brackets.
- RewindOnChange: Enables recursive or cascading transformations.
💡 Why uCalc? (Comparative Analysis)
Most regular expression engines handle global settings with flags that apply to the entire regex object (e.g., RegexOptions.IgnoreCase in .NET, or the /i flag in Perl/JavaScript). This is often an all-or-nothing choice. If you need two patterns with different case sensitivity, you typically need to create two separate regex objects.
uCalc's model is more object-oriented and flexible. The DefaultRuleSet provides instance-level defaults for a specific Transformer object. This offers superior encapsulation, allowing you to have multiple Transformer instances with different default behaviors running concurrently. Furthermore, the ability to override these defaults on a per-rule basis provides a powerful, two-tiered configuration system that is not available with simple global regex flags.
Examples
WhitespaceSensitive()
using uCalcSoftware;
var uc = new uCalc();
var t = uc.NewTransformer();
var Text = "This is a test.";
var p = t.FromTo("This {words:3}", "[{words}]");
Console.WriteLine($"Input: {Text}");
Console.WriteLine($"Pattern: {p.Pattern}");
Console.WriteLine("");
Console.WriteLine("3 captured tokens are in brackets");
Console.WriteLine("");
Console.WriteLine($"WhitespaceSensitive = {t.DefaultRuleSet.WhitespaceSensitive}");
Console.WriteLine(t.Transform(Text));
Console.WriteLine("");
t.DefaultRuleSet.WhitespaceSensitive = true;
Console.WriteLine($"WhitespaceSensitive = {t.DefaultRuleSet.WhitespaceSensitive}");
Console.WriteLine(t.Transform(Text));
Input: This is a test.
Pattern: This {words:3}
3 captured tokens are in brackets
WhitespaceSensitive = False
[is a test].
WhitespaceSensitive = True
[ is ]a test. using uCalcSoftware; var uc = new uCalc(); var t = uc.NewTransformer(); var Text = "This is a test."; var p = t.FromTo("This {words:3}", "[{words}]"); Console.WriteLine($"Input: {Text}"); Console.WriteLine($"Pattern: {p.Pattern}"); Console.WriteLine(""); Console.WriteLine("3 captured tokens are in brackets"); Console.WriteLine(""); Console.WriteLine($"WhitespaceSensitive = {t.DefaultRuleSet.WhitespaceSensitive}"); Console.WriteLine(t.Transform(Text)); Console.WriteLine(""); t.DefaultRuleSet.WhitespaceSensitive = true; Console.WriteLine($"WhitespaceSensitive = {t.DefaultRuleSet.WhitespaceSensitive}"); Console.WriteLine(t.Transform(Text));
#include
#include "uCalc.h"
using namespace std;
using namespace uCalcSoftware;
#define tf(IsTrue) ((IsTrue) ? "True" : "False")
int main() {
uCalc uc;
auto t = uc.NewTransformer();
auto Text = "This is a test.";
auto p = t.FromTo("This {words:3}", "[{words}]");
cout << "Input: " << Text << endl;
cout << "Pattern: " << p.Pattern() << endl;
cout << "" << endl;
cout << "3 captured tokens are in brackets" << endl;
cout << "" << endl;
cout << "WhitespaceSensitive = " << tf(t.DefaultRuleSet().WhitespaceSensitive()) << endl;
cout << t.Transform(Text) << endl;
cout << "" << endl;
t.DefaultRuleSet().WhitespaceSensitive(true);
cout << "WhitespaceSensitive = " << tf(t.DefaultRuleSet().WhitespaceSensitive()) << endl;
cout << t.Transform(Text) << endl;
}
Input: This is a test.
Pattern: This {words:3}
3 captured tokens are in brackets
WhitespaceSensitive = False
[is a test].
WhitespaceSensitive = True
[ is ]a test. #include <iostream> #include "uCalc.h" using namespace std; using namespace uCalcSoftware; #define tf(IsTrue) ((IsTrue) ? "True" : "False") int main() { uCalc uc; auto t = uc.NewTransformer(); auto Text = "This is a test."; auto p = t.FromTo("This {words:3}", "[{words}]"); cout << "Input: " << Text << endl; cout << "Pattern: " << p.Pattern() << endl; cout << "" << endl; cout << "3 captured tokens are in brackets" << endl; cout << "" << endl; cout << "WhitespaceSensitive = " << tf(t.DefaultRuleSet().WhitespaceSensitive()) << endl; cout << t.Transform(Text) << endl; cout << "" << endl; t.DefaultRuleSet().WhitespaceSensitive(true); cout << "WhitespaceSensitive = " << tf(t.DefaultRuleSet().WhitespaceSensitive()) << endl; cout << t.Transform(Text) << endl; }
Imports System
Imports uCalcSoftware
Public Module Program
Public Sub Main()
Dim uc As New uCalc()
Dim t = uc.NewTransformer()
Dim Text = "This is a test."
Dim p = t.FromTo("This {words:3}", "[{words}]")
Console.WriteLine($"Input: {Text}")
Console.WriteLine($"Pattern: {p.Pattern}")
Console.WriteLine("")
Console.WriteLine("3 captured tokens are in brackets")
Console.WriteLine("")
Console.WriteLine($"WhitespaceSensitive = {t.DefaultRuleSet.WhitespaceSensitive}")
Console.WriteLine(t.Transform(Text))
Console.WriteLine("")
t.DefaultRuleSet.WhitespaceSensitive = true
Console.WriteLine($"WhitespaceSensitive = {t.DefaultRuleSet.WhitespaceSensitive}")
Console.WriteLine(t.Transform(Text))
End Sub
End Module
Input: This is a test.
Pattern: This {words:3}
3 captured tokens are in brackets
WhitespaceSensitive = False
[is a test].
WhitespaceSensitive = True
[ is ]a test. Imports System Imports uCalcSoftware Public Module Program Public Sub Main() Dim uc As New uCalc() Dim t = uc.NewTransformer() Dim Text = "This is a test." Dim p = t.FromTo("This {words:3}", "[{words}]") Console.WriteLine($"Input: {Text}") Console.WriteLine($"Pattern: {p.Pattern}") Console.WriteLine("") Console.WriteLine("3 captured tokens are in brackets") Console.WriteLine("") Console.WriteLine($"WhitespaceSensitive = {t.DefaultRuleSet.WhitespaceSensitive}") Console.WriteLine(t.Transform(Text)) Console.WriteLine("") t.DefaultRuleSet.WhitespaceSensitive = true Console.WriteLine($"WhitespaceSensitive = {t.DefaultRuleSet.WhitespaceSensitive}") Console.WriteLine(t.Transform(Text)) End Sub End Module
StatementSensitive()
using uCalcSoftware;
var uc = new uCalc();
var t = uc.NewTransformer();
t.Text = "x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2";
var p = t.Pattern("if {etc}");
Console.WriteLine($"Input: {t.Text}");
Console.WriteLine($"Pattern: {p.Pattern}");
Console.WriteLine("");
t.Find();
Console.WriteLine($"StatementSensitive: {t.DefaultRuleSet.StatementSensitive}");
Console.WriteLine(t.Matches.Text);
Console.WriteLine("");
t.DefaultRuleSet.StatementSensitive = false;
t.Find();
Console.WriteLine($"StatementSensitive: {t.DefaultRuleSet.StatementSensitive}");
Console.WriteLine(t.Matches.Text);
Input: x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2
Pattern: if {etc}
StatementSensitive: True
if (true) func1(3+4)
StatementSensitive: False
if (true) func1(3+4); else func2(x*y); y = x + 2 using uCalcSoftware; var uc = new uCalc(); var t = uc.NewTransformer(); t.Text = "x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2"; var p = t.Pattern("if {etc}"); Console.WriteLine($"Input: {t.Text}"); Console.WriteLine($"Pattern: {p.Pattern}"); Console.WriteLine(""); t.Find(); Console.WriteLine($"StatementSensitive: {t.DefaultRuleSet.StatementSensitive}"); Console.WriteLine(t.Matches.Text); Console.WriteLine(""); t.DefaultRuleSet.StatementSensitive = false; t.Find(); Console.WriteLine($"StatementSensitive: {t.DefaultRuleSet.StatementSensitive}"); Console.WriteLine(t.Matches.Text);
#include
#include "uCalc.h"
using namespace std;
using namespace uCalcSoftware;
#define tf(IsTrue) ((IsTrue) ? "True" : "False")
int main() {
uCalc uc;
auto t = uc.NewTransformer();
t.Text("x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2");
auto p = t.Pattern("if {etc}");
cout << "Input: " << t.Text() << endl;
cout << "Pattern: " << p.Pattern() << endl;
cout << "" << endl;
t.Find();
cout << "StatementSensitive: " << tf(t.DefaultRuleSet().StatementSensitive()) << endl;
cout << t.Matches().Text() << endl;
cout << "" << endl;
t.DefaultRuleSet().StatementSensitive(false);
t.Find();
cout << "StatementSensitive: " << tf(t.DefaultRuleSet().StatementSensitive()) << endl;
cout << t.Matches().Text() << endl;
}
Input: x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2
Pattern: if {etc}
StatementSensitive: True
if (true) func1(3+4)
StatementSensitive: False
if (true) func1(3+4); else func2(x*y); y = x + 2 #include <iostream> #include "uCalc.h" using namespace std; using namespace uCalcSoftware; #define tf(IsTrue) ((IsTrue) ? "True" : "False") int main() { uCalc uc; auto t = uc.NewTransformer(); t.Text("x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2"); auto p = t.Pattern("if {etc}"); cout << "Input: " << t.Text() << endl; cout << "Pattern: " << p.Pattern() << endl; cout << "" << endl; t.Find(); cout << "StatementSensitive: " << tf(t.DefaultRuleSet().StatementSensitive()) << endl; cout << t.Matches().Text() << endl; cout << "" << endl; t.DefaultRuleSet().StatementSensitive(false); t.Find(); cout << "StatementSensitive: " << tf(t.DefaultRuleSet().StatementSensitive()) << endl; cout << t.Matches().Text() << endl; }
Imports System
Imports uCalcSoftware
Public Module Program
Public Sub Main()
Dim uc As New uCalc()
Dim t = uc.NewTransformer()
t.Text = "x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2"
Dim p = t.Pattern("if {etc}")
Console.WriteLine($"Input: {t.Text}")
Console.WriteLine($"Pattern: {p.Pattern}")
Console.WriteLine("")
t.Find()
Console.WriteLine($"StatementSensitive: {t.DefaultRuleSet.StatementSensitive}")
Console.WriteLine(t.Matches.Text)
Console.WriteLine("")
t.DefaultRuleSet.StatementSensitive = false
t.Find()
Console.WriteLine($"StatementSensitive: {t.DefaultRuleSet.StatementSensitive}")
Console.WriteLine(t.Matches.Text)
End Sub
End Module
Input: x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2
Pattern: if {etc}
StatementSensitive: True
if (true) func1(3+4)
StatementSensitive: False
if (true) func1(3+4); else func2(x*y); y = x + 2 Imports System Imports uCalcSoftware Public Module Program Public Sub Main() Dim uc As New uCalc() Dim t = uc.NewTransformer() t.Text = "x = 1; if (true) func1(3+4); else func2(x*y); y = x + 2" Dim p = t.Pattern("if {etc}") Console.WriteLine($"Input: {t.Text}") Console.WriteLine($"Pattern: {p.Pattern}") Console.WriteLine("") t.Find() Console.WriteLine($"StatementSensitive: {t.DefaultRuleSet.StatementSensitive}") Console.WriteLine(t.Matches.Text) Console.WriteLine("") t.DefaultRuleSet.StatementSensitive = false t.Find() Console.WriteLine($"StatementSensitive: {t.DefaultRuleSet.StatementSensitive}") Console.WriteLine(t.Matches.Text) End Sub End Module
RewindOnChange
using uCalcSoftware;
var uc = new uCalc();
var ExprT = uc.ExpressionTransformer; // Transformer used for Eval() and Evaluate()
ExprT.DefaultRuleSet.RewindOnChange = true;
ExprT.FromTo("AddUp({x})", "{x}");
ExprT.FromTo("AddUp({x}, {y})", "({x} + AddUp({y}))");
ExprT.FromTo("ArgCount({x})", "1");
ExprT.FromTo("ArgCount({x}, {y})", "(1 + ArgCount({y}))");
ExprT.FromTo("Average({x}, {y})", "AddUp({x}, {y}) / ArgCount({x}, {y})");
var Expression = "Average(1, 2, 3, 4)";
Console.WriteLine($"Input: {Expression}");
Console.WriteLine($"Transform: {ExprT.Transform(Expression)}");
Console.WriteLine($"Eval: {uc.Eval(Expression)}");
Input: Average(1, 2, 3, 4)
Transform: (1 + (2 + (3 + 4))) / (1 + (1 + (1 + 1)))
Eval: 2.5 using uCalcSoftware; var uc = new uCalc(); var ExprT = uc.ExpressionTransformer; // Transformer used for Eval() and Evaluate() ExprT.DefaultRuleSet.RewindOnChange = true; ExprT.FromTo("AddUp({x})", "{x}"); ExprT.FromTo("AddUp({x}, {y})", "({x} + AddUp({y}))"); ExprT.FromTo("ArgCount({x})", "1"); ExprT.FromTo("ArgCount({x}, {y})", "(1 + ArgCount({y}))"); ExprT.FromTo("Average({x}, {y})", "AddUp({x}, {y}) / ArgCount({x}, {y})"); var Expression = "Average(1, 2, 3, 4)"; Console.WriteLine($"Input: {Expression}"); Console.WriteLine($"Transform: {ExprT.Transform(Expression)}"); Console.WriteLine($"Eval: {uc.Eval(Expression)}");
#include
#include "uCalc.h"
using namespace std;
using namespace uCalcSoftware;
int main() {
uCalc uc;
auto ExprT = uc.ExpressionTransformer(); // Transformer used for Eval() and Evaluate()
ExprT.DefaultRuleSet().RewindOnChange(true);
ExprT.FromTo("AddUp({x})", "{x}");
ExprT.FromTo("AddUp({x}, {y})", "({x} + AddUp({y}))");
ExprT.FromTo("ArgCount({x})", "1");
ExprT.FromTo("ArgCount({x}, {y})", "(1 + ArgCount({y}))");
ExprT.FromTo("Average({x}, {y})", "AddUp({x}, {y}) / ArgCount({x}, {y})");
auto Expression = "Average(1, 2, 3, 4)";
cout << "Input: " << Expression << endl;
cout << "Transform: " << ExprT.Transform(Expression) << endl;
cout << "Eval: " << uc.Eval(Expression) << endl;
}
Input: Average(1, 2, 3, 4)
Transform: (1 + (2 + (3 + 4))) / (1 + (1 + (1 + 1)))
Eval: 2.5 #include <iostream> #include "uCalc.h" using namespace std; using namespace uCalcSoftware; int main() { uCalc uc; auto ExprT = uc.ExpressionTransformer(); // Transformer used for Eval() and Evaluate() ExprT.DefaultRuleSet().RewindOnChange(true); ExprT.FromTo("AddUp({x})", "{x}"); ExprT.FromTo("AddUp({x}, {y})", "({x} + AddUp({y}))"); ExprT.FromTo("ArgCount({x})", "1"); ExprT.FromTo("ArgCount({x}, {y})", "(1 + ArgCount({y}))"); ExprT.FromTo("Average({x}, {y})", "AddUp({x}, {y}) / ArgCount({x}, {y})"); auto Expression = "Average(1, 2, 3, 4)"; cout << "Input: " << Expression << endl; cout << "Transform: " << ExprT.Transform(Expression) << endl; cout << "Eval: " << uc.Eval(Expression) << endl; }
Imports System
Imports uCalcSoftware
Public Module Program
Public Sub Main()
Dim uc As New uCalc()
Dim ExprT = uc.ExpressionTransformer '// Transformer used for Eval() and Evaluate()
ExprT.DefaultRuleSet.RewindOnChange = true
ExprT.FromTo("AddUp({x})", "{x}")
ExprT.FromTo("AddUp({x}, {y})", "({x} + AddUp({y}))")
ExprT.FromTo("ArgCount({x})", "1")
ExprT.FromTo("ArgCount({x}, {y})", "(1 + ArgCount({y}))")
ExprT.FromTo("Average({x}, {y})", "AddUp({x}, {y}) / ArgCount({x}, {y})")
Dim Expression = "Average(1, 2, 3, 4)"
Console.WriteLine($"Input: {Expression}")
Console.WriteLine($"Transform: {ExprT.Transform(Expression)}")
Console.WriteLine($"Eval: {uc.Eval(Expression)}")
End Sub
End Module
Input: Average(1, 2, 3, 4)
Transform: (1 + (2 + (3 + 4))) / (1 + (1 + (1 + 1)))
Eval: 2.5 Imports System Imports uCalcSoftware Public Module Program Public Sub Main() Dim uc As New uCalc() Dim ExprT = uc.ExpressionTransformer '// Transformer used for Eval() and Evaluate() ExprT.DefaultRuleSet.RewindOnChange = true ExprT.FromTo("AddUp({x})", "{x}") ExprT.FromTo("AddUp({x}, {y})", "({x} + AddUp({y}))") ExprT.FromTo("ArgCount({x})", "1") ExprT.FromTo("ArgCount({x}, {y})", "(1 + ArgCount({y}))") ExprT.FromTo("Average({x}, {y})", "AddUp({x}, {y}) / ArgCount({x}, {y})") Dim Expression = "Average(1, 2, 3, 4)" Console.WriteLine($"Input: {Expression}") Console.WriteLine($"Transform: {ExprT.Transform(Expression)}") Console.WriteLine($"Eval: {uc.Eval(Expression)}") End Sub End Module