diff --git a/applications/test/wordRe/Test-wordRe.C b/applications/test/wordRe/Test-wordRe.C
index 98c4b6ebc6..e420d4bd03 100644
--- a/applications/test/wordRe/Test-wordRe.C
+++ b/applications/test/wordRe/Test-wordRe.C
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -22,6 +22,7 @@ License
along with OpenFOAM. If not, see .
Description
+ Test word/regex
\*---------------------------------------------------------------------------*/
@@ -36,6 +37,16 @@ Description
using namespace Foam;
+
+word typeOf(wordRe::compOption retval)
+{
+ if (wordRe::LITERAL == retval) return "(literal)";
+ if (wordRe::UNKNOWN == retval) return "(unknown)";
+ if (wordRe::REGEX == retval) return "(regex)";
+ return "";
+}
+
+
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
@@ -53,28 +64,30 @@ int main(int argc, char *argv[])
{"this", wordRe::LITERAL},
{"x.*", wordRe::REGEX},
{"file[a-b]", wordRe::REGEX},
+ {"xvalues", wordRe::LITERAL},
+ {"xv.*", wordRe::REGEX},
};
- if (true)
+ if (false)
{
- Info<<"keyType: " << keyre << endl;
+ Info<<"keyType: " << keyre << nl;
keyType key2(std::move(keyre));
- Info<<"move construct: <" << keyre << "> <" << key2 << ">" << endl;
+ Info<<"move construct: <" << keyre << "> <" << key2 << ">" << nl;
keyre = std::move(key2);
- Info<<"move assign: <" << keyre << "> <" << key2 << ">" << endl;
+ Info<<"move assign: <" << keyre << "> <" << key2 << ">" << nl;
keyType key3;
keyre.swap(key3);
- Info<<"swap: <" << keyre << "> <" << key3 << ">" << endl;
+ Info<<"swap: <" << keyre << "> <" << key3 << ">" << nl;
keyre = std::move(key3);
- Info<<"move assign: <" << keyre << "> <" << key3 << ">" << endl;
+ Info<<"move assign: <" << keyre << "> <" << key3 << ">" << nl;
return 0;
}
@@ -83,86 +96,92 @@ int main(int argc, char *argv[])
{
wordRe keyre("y.*", wordRe::REGEX);
- Info<<"wordRe: " << keyre << endl;
+ Info<<"wordRe: " << keyre << nl;
wordRe key2(std::move(keyre));
- Info<<"keyTypes: " << keyre << " " << key2 << endl;
+ Info<<"keyTypes: " << keyre << " " << key2 << nl;
keyre = std::move(key2);
- Info<<"keyTypes: " << keyre << " " << key2 << endl;
+ Info<<"keyTypes: " << keyre << " " << key2 << nl;
wordRe key3;
keyre.swap(key3);
- Info<<"keyTypes: <" << keyre << "> <" << key3 << ">" << endl;
+ Info<<"keyTypes: <" << keyre << "> <" << key3 << ">" << nl;
keyre = std::move(key3);
- Info<<"keyTypes: <" << keyre << "> <" << key3 << ">" << endl;
+ Info<<"keyTypes: <" << keyre << "> <" << key3 << ">" << nl;
return 0;
}
- wordRes wrelist(wordrelist);
+ wordRes wres1(wordrelist);
- Info<< "re-list:" << wrelist << endl;
- Info<< "match this: " << wrelist("this") << endl;
- Info<< "match xyz: " << wrelist("xyz") << endl;
- Info<< "match zyx: " << wrelist("zyx") << endl;
- Info<< "match xyz: " << wrelist.match("xyz") << endl;
- Info<< "match any: " << predicates::always()("any junk") << endl;
- Info<< "keyre match: " << keyre("xyz") << endl;
- Info<< "string match: " << string("this").match("xyz") << endl;
- Info<< "string match: " << string("x.*")("xyz") << endl;
- Info<< "string match: " << string("x.*")(keyre) << endl;
+ Info<< "re-list:" << wres1 << nl;
+ Info<< "match this: " << wres1("this") << nl;
+ Info<< "match xyz: " << wres1("xyz") << nl;
+ Info<< "match zyx: " << wres1("zyx") << nl;
+ Info<< "match xyz: " << wres1.match("xyz") << nl;
+ Info<< "match any: " << predicates::always()("any junk") << nl;
- wordRe(s1, wordRe::DETECT).info(Info) << endl;
- wordRe(s2).info(Info) << endl;
- wordRe(s2, wordRe::DETECT).info(Info) << endl;
- wordRe(s3, wordRe::REGEX).info(Info) << endl;
+ Info<< "match xvalues: " << wres1.match("xvalues") << nl;
+ Info<< "matched xvalues = " << typeOf(wres1.matched("xvalues")) << nl;
+ Info<< "matched xval = " << typeOf(wres1.matched("xval")) << nl;
+ Info<< "matched zyx = " << typeOf(wres1.matched("zyx")) << nl;
+
+ Info<< "keyre match: " << keyre("xyz") << nl;
+ Info<< "string match: " << string("this").match("xyz") << nl;
+ Info<< "string match: " << string("x.*")("xyz") << nl;
+ Info<< "string match: " << string("x.*")(keyre) << nl;
+
+ wordRe(s1, wordRe::DETECT).info(Info) << nl;
+ wordRe(s2).info(Info) << nl;
+ wordRe(s2, wordRe::DETECT).info(Info) << nl;
+ wordRe(s3, wordRe::REGEX).info(Info) << nl;
wre = "this .* file";
- Info<<"substring: " << wre.substr(4) << endl;
+ Info<<"substring: " << wre.substr(4) << nl;
- wre.info(Info) << endl;
+ wre.info(Info) << nl;
wre = s1;
- wre.info(Info) << endl;
+ wre.info(Info) << nl;
wre.uncompile();
- wre.info(Info) << endl;
+ wre.info(Info) << nl;
wre = "something";
- wre.info(Info) << " before" << endl;
+ wre.info(Info) << " before" << nl;
wre.uncompile();
- wre.info(Info) << " uncompiled" << endl;
+ wre.info(Info) << " uncompiled" << nl;
wre.compile(wordRe::DETECT);
- wre.info(Info) << " after DETECT" << endl;
+ wre.info(Info) << " after DETECT" << nl;
wre.compile(wordRe::ICASE);
- wre.info(Info) << " after ICASE" << endl;
+ wre.info(Info) << " after ICASE" << nl;
wre.compile(wordRe::DETECT_ICASE);
- wre.info(Info) << " after DETECT_ICASE" << endl;
+ wre.info(Info) << " after DETECT_ICASE" << nl;
wre = "something .* value";
- wre.info(Info) << " before" << endl;
+ wre.info(Info) << " before" << nl;
wre.uncompile();
- wre.info(Info) << " uncompiled" << endl;
+ wre.info(Info) << " uncompiled" << nl;
wre.compile(wordRe::DETECT);
- wre.info(Info) << " after DETECT" << endl;
+ wre.info(Info) << " after DETECT" << nl;
wre.uncompile();
- wre.info(Info) << " uncompiled" << endl;
+ wre.info(Info) << " uncompiled" << nl;
wre.compile();
- wre.info(Info) << " re-compiled" << endl;
+ wre.info(Info) << " re-compiled" << nl;
wre.set("something .* value", wordRe::LITERAL);
- wre.info(Info) << " set as LITERAL" << endl;
+ wre.info(Info) << " set as LITERAL" << nl;
IOobject::writeDivider(Info);
List> rawList(IFstream("testRegexps")());
- Info<< "input list:" << rawList << endl;
- IOobject::writeDivider(Info) << endl;
+ Info<< "input list:" << rawList << nl;
+ IOobject::writeDivider(Info) << nl;
forAll(rawList, elemI)
{
@@ -174,7 +193,7 @@ int main(int argc, char *argv[])
<< "(" << wre.match(str, true) << ")"
<< " match:" << wre.match(str)
<< " str=" << str
- << endl;
+ << nl;
wordRe wre2;
wre2.set(wre, wordRe::ICASE);
@@ -182,11 +201,11 @@ int main(int argc, char *argv[])
wre2.info(Info)
<< " match:" << wre2.match(str)
<< " str=" << str
- << endl;
+ << nl;
}
- Info<< endl;
+ Info<< "\nEnd\n" << endl;
return 0;
}
diff --git a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
index 78df05d192..546b53d74d 100644
--- a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
+++ b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
@@ -440,7 +440,7 @@ int main(int argc, char *argv[])
{
const wordRes patchNames(args.getList("patches"));
- if (patchNames.size() == 1 && !patchNames.first().isPattern())
+ if (patchNames.size() == 1 && patchNames.first().isLiteral())
{
exposedPatchIDs.first() =
getExposedPatchId(mesh, patchNames.first());
diff --git a/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C b/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C
index 6a41293989..25e452fce3 100644
--- a/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C
+++ b/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C
@@ -58,7 +58,7 @@ bool Foam::functionEntries::removeEntry::execute
for (const keyType& key : patterns)
{
- if (key.find('/') != string::npos || !key.isPattern())
+ if (key.isLiteral() && key.find('/') != string::npos)
{
// Remove scoped keyword, or keyword in the local scope
dictionary::searcher finder =
diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C
index 53faf5c046..ee127be278 100644
--- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C
+++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C
@@ -53,7 +53,7 @@ readField
// patch name since is key of dictionary.
forAllConstIter(dictionary, dict, iter)
{
- if (iter().isDict() && !iter().keyword().isPattern())
+ if (iter().isDict() && iter().keyword().isLiteral())
{
const label patchi = bmesh_.findPatchID(iter().keyword());
@@ -96,7 +96,7 @@ readField
{
const entry& e = iter();
- if (e.isDict() && !e.keyword().isPattern())
+ if (e.isDict() && e.keyword().isLiteral())
{
const labelList patchIds =
bmesh_.indices(e.keyword(), true); // use patchGroups
diff --git a/src/OpenFOAM/primitives/strings/keyType/keyType.H b/src/OpenFOAM/primitives/strings/keyType/keyType.H
index 188c66e738..608468105f 100644
--- a/src/OpenFOAM/primitives/strings/keyType/keyType.H
+++ b/src/OpenFOAM/primitives/strings/keyType/keyType.H
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -29,8 +29,7 @@ Description
A keyType is the keyword of a dictionary.
It differs from word in that it also accepts patterns (regular expressions).
- It is very similar to wordRe, but doesn't store the regular expression
- separately.
+ It is very similar to wordRe, but doesn't store a regular expression.
SourceFiles
keyType.C
@@ -47,12 +46,10 @@ SourceFiles
namespace Foam
{
-// Forward declaration of classes
+// Forward declarations
+class keyType;
class Istream;
class Ostream;
-
-// Forward declaration of friend functions and operators
-class keyType;
Istream& operator>>(Istream& is, keyType& kw);
Ostream& operator<<(Ostream& os, const keyType& kw);
@@ -70,6 +67,7 @@ class keyType
//- Is the keyType a pattern (regular expression)
bool isPattern_;
+
// Private Member Functions
//- No assignment where we cannot determine string/word type
@@ -121,14 +119,17 @@ public:
keyType(Istream& is);
- // Member functions
+ // Member Functions
//- Is this character valid for a keyType?
// This is largely identical with what word accepts, but also
// permit brace-brackets, which are valid for some regexs.
inline static bool valid(char c);
- //- Treat as a pattern rather than a literal string?
+ //- The keyType is treated as literal, not as pattern.
+ inline bool isLiteral() const;
+
+ //- The keyType is treated as a pattern, not as literal string.
inline bool isPattern() const;
//- Swap contents
@@ -139,7 +140,7 @@ public:
bool match(const std::string& text, bool literal = false) const;
- // Member operators
+ // Member Operators
//- Perform smart match on text, as per match()
// Allows use as a predicate.
@@ -162,7 +163,7 @@ public:
inline void operator=(const char* s);
- // IOstream operators
+ // IOstream Operators
friend Istream& operator>>(Istream& is, keyType& kw);
friend Ostream& operator<<(Ostream& os, const keyType& kw);
diff --git a/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H b/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H
index 3885e6ecf2..bf84de6a23 100644
--- a/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H
+++ b/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H
@@ -84,7 +84,6 @@ inline Foam::keyType::keyType(const std::string& s, const bool isPattern)
{}
-
inline Foam::keyType::keyType(keyType&& s)
:
word(std::move(static_cast(s)), false),
@@ -117,6 +116,12 @@ inline Foam::keyType::keyType(std::string&& s, const bool isPattern)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+inline bool Foam::keyType::isLiteral() const
+{
+ return !isPattern_;
+}
+
+
inline bool Foam::keyType::isPattern() const
{
return isPattern_;
diff --git a/src/OpenFOAM/primitives/strings/wordRe/wordRe.H b/src/OpenFOAM/primitives/strings/wordRe/wordRe.H
index 4c7294aab9..9976ecb6dc 100644
--- a/src/OpenFOAM/primitives/strings/wordRe/wordRe.H
+++ b/src/OpenFOAM/primitives/strings/wordRe/wordRe.H
@@ -59,7 +59,7 @@ SourceFiles
namespace Foam
{
-// Forward declaration of friend functions and operators
+// Forward declarations
class wordRe;
class Istream;
class Ostream;
@@ -81,6 +81,7 @@ class wordRe
//- The regular expression
mutable regExp re_;
+
public:
// Static data members
@@ -97,6 +98,7 @@ public:
{
LITERAL = 0, //!< Treat as a string literal
DETECT = 1, //!< Detect if the string contains meta-characters
+ UNKNOWN = 1, //!< Unknown content.
REGEX = 2, //!< Treat as regular expression
ICASE = 4, //!< Ignore case in regular expression
NOCASE = 4, //!< \deprecated Alias for ICASE (deprecated APR-2018)
@@ -163,11 +165,14 @@ public:
wordRe(Istream& is);
- // Member functions
+ // Member Functions
// Access
- //- Treat as a pattern rather than a literal string?
+ //- The wordRe is treated as literal, not as pattern.
+ inline bool isLiteral() const;
+
+ //- The wordRe is treated as a pattern, not as literal string.
inline bool isPattern() const;
@@ -248,7 +253,7 @@ public:
inline void operator=(wordRe&& str);
- // IOstream operators
+ // IOstream Operators
friend Istream& operator>>(Istream& is, wordRe& w);
friend Ostream& operator<<(Ostream& os, const wordRe& w);
diff --git a/src/OpenFOAM/primitives/strings/wordRe/wordReI.H b/src/OpenFOAM/primitives/strings/wordRe/wordReI.H
index 5e9532c7b9..13579d76c7 100644
--- a/src/OpenFOAM/primitives/strings/wordRe/wordReI.H
+++ b/src/OpenFOAM/primitives/strings/wordRe/wordReI.H
@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
- \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@@ -157,6 +157,12 @@ inline Foam::wordRe::wordRe(const word& str, const compOption opt)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+inline bool Foam::wordRe::isLiteral() const
+{
+ return !re_.exists();
+}
+
+
inline bool Foam::wordRe::isPattern() const
{
return re_.exists();
diff --git a/src/OpenFOAM/primitives/strings/wordRes/wordRes.H b/src/OpenFOAM/primitives/strings/wordRes/wordRes.H
index 28cf35b972..197823682c 100644
--- a/src/OpenFOAM/primitives/strings/wordRes/wordRes.H
+++ b/src/OpenFOAM/primitives/strings/wordRes/wordRes.H
@@ -53,7 +53,7 @@ class wordRes
{
// Private Methods
- //- Check for any match of text in list of matchers
+ //- Smart match as literal or regex, stopping on the first match.
inline static bool found_match
(
const UList& patterns,
@@ -61,6 +61,17 @@ class wordRes
bool literal=false
);
+ //- Smart match across entire list, returning the match type.
+ // Stops on the first literal match, or continues to examine
+ // if a regex match occurs.
+ // \return wordRe::LITERAL, wordRe::REGEX on match and
+ // wordRe::UNKNOWN otherwise.
+ inline static wordRe::compOption found_matched
+ (
+ const UList& patterns,
+ const std::string& text
+ );
+
public:
@@ -111,16 +122,23 @@ public:
// No filtering attempted on regular expressions.
void uniq();
- //- Return true if string matches ANY of the regular expressions
- // Smart match as regular expression or as a string.
- // Optionally force a literal match only
- inline bool match(const std::string& text, bool literal=false) const;
+ //- Smart match as literal or regex, stopping on the first match.
+ //
+ // \param literal Force literal match only.
+ // \return True if text matches ANY of the entries.
+ inline bool match(const std::string& text, bool literal = false) const;
+
+ //- Smart match in the list of matchers, returning the match type.
+ // It stops if there is a literal match, or continues to examine
+ // other regexs.
+ // \return LITERAL if a lteral match was found, REGEX if a regex
+ // match was found and UNKNOWN otherwise.
+ inline wordRe::compOption matched(const std::string& text) const;
- // Member operators
+ // Member Operators
- //- Perform smart match on text, as per match()
- // Allows use as a predicate.
+ //- Identical to match(), for use as a predicate.
inline bool operator()(const std::string& text) const;
};
diff --git a/src/OpenFOAM/primitives/strings/wordRes/wordResI.H b/src/OpenFOAM/primitives/strings/wordRes/wordResI.H
index ab602ee1f8..65cbe2fe46 100644
--- a/src/OpenFOAM/primitives/strings/wordRes/wordResI.H
+++ b/src/OpenFOAM/primitives/strings/wordRes/wordResI.H
@@ -50,6 +50,36 @@ inline bool Foam::wordRes::found_match
}
+inline Foam::wordRe::compOption Foam::wordRes::found_matched
+(
+ const UList& patterns,
+ const std::string& text
+)
+{
+ auto retval(wordRe::compOption::UNKNOWN);
+
+ for (const wordRe& select : patterns)
+ {
+ if (select.isLiteral())
+ {
+ if (select.match(text, true))
+ {
+ return wordRe::compOption::LITERAL;
+ }
+ }
+ else if (wordRe::compOption::UNKNOWN == retval)
+ {
+ if (select.match(text, false))
+ {
+ retval = wordRe::compOption::REGEX;
+ }
+ }
+ }
+
+ return retval;
+}
+
+
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline bool Foam::wordRes::match(const std::string& text, bool literal) const
@@ -58,6 +88,13 @@ inline bool Foam::wordRes::match(const std::string& text, bool literal) const
}
+inline Foam::wordRe::compOption
+Foam::wordRes::matched(const std::string& text) const
+{
+ return found_matched(*this, text);
+}
+
+
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
inline bool Foam::wordRes::operator()(const std::string& text) const
diff --git a/src/OpenFOAM/primitives/transform/transform.H b/src/OpenFOAM/primitives/transform/transform.H
index cb72b2ba18..46c8aaad32 100644
--- a/src/OpenFOAM/primitives/transform/transform.H
+++ b/src/OpenFOAM/primitives/transform/transform.H
@@ -170,7 +170,7 @@ inline label invTransform(const tensor&, const label i)
}
-//- No-op rotational transform of a label
+//- No-op rotational transform of a scalar
inline scalar transform(const tensor&, const scalar s)
{
return s;
diff --git a/src/functionObjects/field/ddt2/ddt2.C b/src/functionObjects/field/ddt2/ddt2.C
index d00fb6d0c6..73a846f372 100644
--- a/src/functionObjects/field/ddt2/ddt2.C
+++ b/src/functionObjects/field/ddt2/ddt2.C
@@ -174,9 +174,9 @@ bool Foam::functionObjects::ddt2::execute()
// Check exact matches first
for (const wordRe& select : selectFields_)
{
- if (!select.isPattern())
+ if (select.isLiteral())
{
- const word& fieldName = static_cast(select);
+ const word& fieldName = select;
if (!candidates.erase(fieldName))
{
diff --git a/src/functionObjects/field/zeroGradient/zeroGradient.C b/src/functionObjects/field/zeroGradient/zeroGradient.C
index 1575a9be39..f5b36b79a7 100644
--- a/src/functionObjects/field/zeroGradient/zeroGradient.C
+++ b/src/functionObjects/field/zeroGradient/zeroGradient.C
@@ -133,9 +133,9 @@ bool Foam::functionObjects::zeroGradient::execute()
// Check exact matches first
for (const wordRe& select : selectFields_)
{
- if (!select.isPattern())
+ if (select.isLiteral())
{
- const word& fieldName = static_cast(select);
+ const word& fieldName = select;
if (!candidates.erase(fieldName))
{
diff --git a/src/functionObjects/utilities/ensightWrite/ensightWrite.C b/src/functionObjects/utilities/ensightWrite/ensightWrite.C
index 75e741c2cb..710bee74fe 100644
--- a/src/functionObjects/utilities/ensightWrite/ensightWrite.C
+++ b/src/functionObjects/utilities/ensightWrite/ensightWrite.C
@@ -284,7 +284,7 @@ bool Foam::functionObjects::ensightWrite::write()
// Check exact matches first
for (const wordRe& select : selectFields_)
{
- if (!select.isPattern())
+ if (select.isLiteral())
{
const word& fieldName = select;